从Windows迁移到Linux之后,我想找到Winmerge的替代软件,或者想学习命令行工具来比较和同步Linux上的两个文件夹。如果您能告诉我如何在命令行中执行以下任务,我将不胜感激((我已经研究了diff和rsync,但是我仍然需要一些帮助。)

我们有两个文件夹:“ / home / user / A”和“ / home / user / B”

文件夹A是保存常规文件和文件夹的位置,文件夹B是作为完整文件夹的备份文件夹文件夹A的镜像。(文件夹B中的任何内容都不能直接由用户保存或修改。)

我的问题是:


如何列出存在的文件仅在文件夹B中? (例如,自上次同步以来从文件夹A中删除的文件。)
如何将仅存在于文件夹B中的文件复制回文件夹A中?
如何列出两个文件夹中存在但具有不同时间戳的文件或尺寸? (自上次同步以来已在文件夹A中进行过修改的文件。我想避免使用校验和,因为有成千上万个文件,这会使处理过程太慢。)
如何准确将文件夹A复制到文件夹B?我的意思是,将文件夹A中的所有内容复制到仅存在于文件夹A中的文件夹B中,并删除文件夹B中仅存在于文件夹B中的所有内容,但不要触摸两个文件夹中相同的文件。


评论

为什么不为此使用适当的备份程序?重复性就是一个例子。

#1 楼

这会将文件夹A放入文件夹B中: 。这将不占用文件夹A,而是将其所有内容放入文件夹B。像这样:

保留所有文件系统特性/home/user/A/删除目标文件夹中源文件中不存在的文件

联机帮助页:https://download.samba.org/pub/rsync/rsync.html

评论


rsync:运行rsync应用程序,-a:执行同步,保留所有文件系统属性,-v:详细运行,-z:在同步期间压缩数据(以压缩模式传输数据),--delete:删除目标中的文件源文件夹中不存在的文件夹,/ home / user / A:源文件夹,/ home / user / B:目标文件夹

– SonicARG
16年7月9日在19:25

嗨,SonicARG,我完全忘了回到这个问题上来做解释了,感谢您提交了解释,我把您的回答写了出来,希望您不要介意。

– TuxForLife
16年7月11日在5:43



Rsync的主要目的是在不同计算机之间复制文件,如此处所述,它也可以用于同步目录。因此,-z选项很有趣,可以减少网络流量,从而提高两台计算机之间的rsync性能:(从磁盘读取数据->压缩)=== network ===>(解压缩->写入磁盘)使用- z同步同一主机上的2个目录有点傻,并且浪费了CPU周期(从磁盘读取数据->压缩->解压缩->写入磁盘)

– GerritCap
17-3-29在8:51



@GerritCap,我进行了编辑,感谢您的宝贵意见

– TuxForLife
18年7月6日在15:48

我已经尝试过该命令,但是它创建了一个子目录/ home / user / B / A而不是将A的内容覆盖为B的内容。你能帮我看看吗?

–卢克
18-09-19在3:24



#2 楼

您可以使用U Penn的Benjamin Pierce开发的unison工具。

让我们假设您有两个目录,分别是第二,您可以使用:

〜$ /home/user/Documents/dirA/

在输出中,/home/user/Documents/dirB/将显示您要同步的两个目录中每个不同的目录和文件。建议您在初次运行时进行附加同步(在两个位置复制丢失的文件),然后在计算机上创建并维护一个同步树,在以后的运行中它将实现真正的同步(即,如果您从unison -ui text /home/user/Documents/dirA/ /home/user/Documents/dirB/删除文件,您也可以比较每个更改,还可以选择在两个目录之间进行正向或反向同步。

(可选)要启动图形界面,只需删除unison选项尽管您发现.../dirA使用起来更简单,更快捷,但您还是可以从命令中获取。

#3 楼

TuxForLife的答案很好,但是我强烈建议您在本地同步时使用-c。您可能会争辩说,进行远程同步不值得花费时间/网络时间,但对于本地文件而言却完全值得,因为速度非常快。


-c, --checksum
       This forces the sender to checksum every regular file using a 128-bit  MD4
       checksum.   It  does this during the initial file-system scan as it builds
       the list of all available files. The receiver then checksums  its  version
       of  each  file  (if  it exists and it has the same size as its sender-side
       counterpart) in order to decide which files need to be updated: files with
       either  a  changed  size  or a changed checksum are selected for transfer.
       Since this whole-file checksumming of all files on both sides of the  con-
       nection  occurs  in  addition to the automatic checksum verifications that
       occur during a file's transfer, this option can be quite slow.

       Note that rsync always verifies that each transferred file  was  correctly
       reconstructed  on  the receiving side by checking its whole-file checksum,
       but that automatic after-the-transfer verification has nothing to do  with
       this  option's  before-the-transfer  "Does  this file need to be updated?"
       check.



这说明了具有相同大小和时间戳的方法如何会使您失败。 >由于文件都具有相同的大小和时间戳,因此不复制任何内容的rsync

$ cd /tmp

$ mkdir -p {A,b}/1/2/{3,4}

$ echo "\___________from A" | \
      tee A/1/2/x  | tee A/1/2/3/y  | tee A/1/2/4/z  | \
  tr A b | \
      tee b/1/2/x  | tee b/1/2/3/y  | tee b/1/2/4/z  | \
      tee b/1/2/x0 | tee b/1/2/3/y0 >     b/1/2/4/z0

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b


由于比较校验和而正确工作的rsync

$ rsync -avu A/ b
building file list ... done

sent 138 bytes  received 20 bytes  316.00 bytes/sec
total size is 57  speedup is 0.36

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b    


评论


-c和-u一起工作是否很好?

–谢尔盖·科尔佐夫(Sergey Korzhov)
19年7月15日在9:31

@SergeyKorzhov可以。仅当目标位置不是较新时,“-u”仍将照常工作以进行更新。

–布鲁诺·布鲁诺斯基(Bruno Bronosky)
19年7月15日在19:15

#4 楼

这就是我用来备份个人文件的方式,我不在乎-a所涵盖的所有内容,而是希望打印出更多有用的信息。
从rsync手册页:

-r,--recursive
,这告诉rsync递归复制目录。
-t,--times
这告诉rsync传输修改时间以及文件,并在远程系统上对其进行更新。修改的时间比源文件新。 (如果现有目标文件的修改时间与源文件的修改时间相等,则如果大小不同,它将被更新。)
--info = FLAGS
通过此选项,您可以对要输出的信息进行细粒度的控制。请参见。

来自rsync -rtu --delete --info=del,name,stats2 "/home/<user>/<src>/" "/run/media/<user>/<drive>/<dst>"
DEL        Mention deletions on the receiving side  
NAME       Mention 1) updated file/dir names, 2) unchanged names  
STATS      Mention statistics at end of run (levels 1-3)

虽然不那么明确,但它似乎等效且更短:

-v,--verbose
-v将为您提供有关正在传输哪些文件的信息,并在[stats1]末尾提供简短摘要。 >

#5 楼

您可以看看Fitus / Zaloha.sh。它是一种同步器,实现为仅使用标准Unix命令的bash shell脚本。易于使用:

$ Zaloha.sh --sourceDir="test_source" --backupDir="test_backup"


#6 楼

您可以通过以下方式使用它:

rsync -avu --delete /home/user/A/* /home/user/B/


通过这种方式,您可以将文件夹A的内容复制到文件夹B中,而不是复制文件夹A本身的内容。

#7 楼

旧线程,但是使用它来同步两个2TB驱动器。
使用
 $ rsync -cavu --delete /home/user/A/* /home/user/B/

不起作用(说“不存在这样的目录”),但是使用
 $ rsync -cavu --delete /home/user/A /home/user/B 

做过...

#8 楼

另一个选择:https://github.com/mikkorantalainen/rsync-continuous
此脚本在bash上使用inotifywaitrsyncssh来创建非常快速的单向同步,因为仅需要传输修改过的文件,如果仅一部分的文件已被修改,rsync将仅传输修改后的部分。