Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何比较重复目录之间的文件大小匹配?_Bash_Shell_Backup_Rsync_Scp - Fatal编程技术网

Bash 如何比较重复目录之间的文件大小匹配?

Bash 如何比较重复目录之间的文件大小匹配?,bash,shell,backup,rsync,scp,Bash,Shell,Backup,Rsync,Scp,我需要比较两个目录来验证备份 假设我的目录如下所示: Filename Filesize Filename Filesize user@main_server:~/mydir/ user@backup_server:~/mydir/ file1000.txt 4182410737 file1000.txt 4182410737 file1001.txt 8241410737 -

我需要比较两个目录来验证备份

假设我的目录如下所示:

Filename        Filesize      Filename        Filesize
user@main_server:~/mydir/     user@backup_server:~/mydir/
file1000.txt    4182410737    file1000.txt    4182410737
file1001.txt    8241410737    -                          <-- missing on backup_server!
...                           ...
file9999.txt    2410418737    file9999.txt    1111111111 <-- size != main_server
(目标是指示备份脚本重新蚀刻这些文件)

我试图得到以下的变化,但没有用

[main_server] $ rsync -n ~/mydir/ user@backup_server:~/mydir

我无法执行
rsync
来备份目录本身,因为它需要太长的时间(8-24小时)。相反,我运行多个
scp
线程来批量获取文件。这将定期完成默认情况下,rsync使用快速检查方法,仅传输大小不同或上次修改时间不同的文件。当您报告大小不变时,这似乎表明时间戳不同。实现这一点的两个选项是:

  • 使用
    -p
    在传输文件时保留时间戳

  • 使用
    --size only
    忽略时间戳并仅传输大小不同的文件


如果您有预算,那么有一些商业文件传输解决方案的性能要比SCP或SFTP好得多。如果您已经有了部分拷贝,
rsync
应该比
SCP
@John1024快得多,谢谢。我刚刚在一个测试中尝试了这个方法:备份100个1GB的文件(用urandom填充)。我先把它们翻过来。确认所有100个文件都存在,并且文件大小正确。然后我运行了
rsync-Sa~/source/~/destination
,看到所有100个文件再次同步,这次是通过
rsync
。这些不是你说的“部分拷贝”。它们是相同的副本,通过
scp
从一台服务器发送到另一台服务器。我错过了什么?第一个
scp
花了4m44s。rsync(在所有文件都被scp接收后)花费了16m12s。我希望
scp
默认采用@Ryan,
rsync
使用快速检查方法,只传输大小不同或上次修改时间不同的文件。什么是源文件系统和目标文件系统(ext4、ntfs等)?或者,有什么东西会影响源或目标上的时间戳吗?@John1024,谢谢!这正是正确的方向。我添加了
-p
以保留时间。文件大小相同,但时间不同。不再是了
rsync
scp
中保存时间后立即运行。如果你想在回答中提出这一点,我很乐意奖励你的意见。
[main_server] $ rsync -n ~/mydir/ user@backup_server:~/mydir
# Generate Large Files (1GB)
for i in {1..100}; do head -c 1073741824 </dev/urandom >foo-$i ; done

# SCP them from src to dest
for i in {1..100}; do ( scp ~/mydir/foo-$i user@backup_server:~/mydir/ & ) ; sleep 0.1 ; done

# Confirm destination has everything from source
# This is the point of the question. I've tried:

rsync -Sa ~/mydir/ user@backup_server:~/mydir
# Way too slow