2011-03-20 93 views
1

有时会发生由于某种原因复制许多文件(即使用Nautilus文件管理器到外部硬盘)的过程崩溃。如果我再次启动它,我会忽略已存在的文件,尽管其中有些文件未被复制100%。因此,属性窗口显示了源文件夹中的“460个文件(225 GB)”和目标文件夹中的“460个文件(222 GB)”...比较bash中2个目录的所有文件大小

我现在该如何找出哪些文件只被部分复制可能使用lsdiff)?

回答

3

如果您有rsync可用,那么在两个本地目录之间工作得很好。

+0

+1。这绝对是同步目录的方式,它比使用shell脚本所能做的任何事情都快。 – 2011-03-20 17:21:59

+0

不是这个问题的答案,但是最好的答案是:-)我之前使用过一次或两次rsync,但并不认为这比仅仅使用cp'ing要好得多...... – flo 2011-03-20 20:52:14

+0

有时候“不要打败你自己用错误的工具头“是问题的答案。 :-) – Blrfl 2011-03-20 21:50:22

2
for f1 in dir1/* 
do 
    f2="dir2/${f##*/}" 
    if [[ $(sum "$f1") != $(sum "$f2") ]] 
    then 
     printf 'File %s does not match %s\n' "$f1" "$f2" 
    fi 
done 

或者你可以使用它作为你的测试:

if ! diff -q "$f1" $f2" >/dev/null 
0

我修改了丹尼斯的代码。它比较文件大小。比较校验和更快但不安全。

source=/??? 
target=/??? 


for i in "$source"/* 
do 
f1=`stat -c%s $i` 
f2=`stat -c%s $target/${i##*/}` 
    if [ "$f1" = "$f2" ]; then 
     echo "$i" "$f1" VS "$target/${i##*/}" "$f2" "====>>>" "OK" 
    else 
     echo "$i" "$f1" VS "$target/${i##*/}" "$f2" "====>>>" "BAD" 
    fi 
done 
+1

如果你有'stat'可用。另外,你应该使用'$()'而不是反引号。而且,对于每个'echo'语句,一组引号就足够了。你为什么这样打破他们? – 2011-03-20 20:02:35

+0

这不适用于子目录,会吗??因为我的文件夹包含许多子文件夹与其他子文件夹等等,所以我认为最好用'find'(?) – flo 2011-03-20 20:56:50

+0

完成耶对于子目录是行不通的。应该写这个。 – alperenc 2011-03-20 23:34:47

相关问题