我也尝试过rsync干运行,这似乎也需要同样的时间。输出通过sed,我试过没有,它似乎没有任何影响。我也忽略隐藏文件。我想我可能错误地使用diff -q来比较2个目录的内容。
我使用了另一个提示的代码块来计算这些目录中的一个是多长时间(1个目录,14个子目录),花了88分钟。然而,每个文件都是30分钟的电视节目,所以如果差异比较这些文件,这是有道理的,但我认为-q会导致这种情况不会发生?
另外,一个目录安装在AFP上,一个是火线连接的外部驱动器。这没关系,因为我在本地复制了两个目录,并且差异占用了相同的时间。 我有一个解决方案 - 我在两个目录上运行ls -1并对输出进行差异化 - 但为什么差异需要这么长时间才能运行?
这是代码;有什么建议吗?
#!/bin/bash
before="$(date +%s)"
diff -r -x '.*' /Volumes/directory1/ /Volumes/directory2/ | sed 's/^.\{24\}//g' > /Volumes/stuff.txt
diff -r -x '.*' /Volumes/directory3/ /Volumes/directory4/ | sed 's/^.\{24\}//g' > /Volumes/stuff.txt
diff -r -x '.*' /Volumes/directory5/ /Volumes/directory6/ | sed 's/^.\{24\}//g' > /Volumes/stuff.txt
diff -r -x '.*' /Volumes/directory7/ /Volumes/directory8/ | sed 's/^.\{24\}//g' > /Volumes/stuff.txt
diff -r -x '.*' /Volumes/directory9/ /Volumes/directory10/ | sed 's/^.\{24\}//g' > /Volumes/stuff.txt
diff -r -x '.*' /Volumes/directory11/ /Volumes/directory12/ | sed 's/^.\{24\}//g' > /Volumes/stuff.txt
after="$(date +%s)"
elapsed_seconds="$(expr $after - $before)"
echo Elapsed time for code block: $elapsed_seconds
答案 0 :(得分:11)
当文件不同时,diff
将能够很快地解决这个问题。但是,当它们相同时,它必须完整扫描文件以验证它们确实是逐字节相同的。
如果您关心的只是文件名的差异而不想检查文件的内容,请尝试以下方法:
diff <(find /Volumes/directory1/ -printf '%P\n') \
<(find /Volumes/directory2/ -printf '%P\n')
这假设你有-printf
动作的GNU查找。如果你不这样做,请根据戈登的评论使用一些子壳魔法:
diff <(cd /Volumes/directory1; find .) \
<(cd /Volumes/directory2; find .)