考虑我从一个磁盘(例如 SD 卡)复制文件的情况 到给定的目录,例如。
/home/pepa/dir1
假设文件数量不是太大:
#!/bin/bash
sd=$1
dir1=$2
mksums()(
if cd "$1"; then
find -type f -exec sha256sum {} + |\
sed 's/^\\//'
fi
)
awk '
NR==FNR { k=$1; sub(/^[^ ]* ./,""); a[k]=$0 ; next }
{ delete a[$1] }
END { print "missing files:"; for(i in a) print a[i] }
' <(mksums "$sd") <(mksums "$dir1")
sha256sum
计算 SD 上文件的校验和列表sha256sum
计算 DIR1 中文件的校验和列表sed
删除指标sha256sum
添加到标志文件名中有奇怪的字符awk
来匹配两个列表:
为清楚起见,省略了错误检查。
对于非常大量的文件,可以交替生成两个列表,
sort
,并提供给comm
:
...
tmp=/my/tmp/folder
mksums "$sd" | sort > "$tmp"/sd-sums
mksums "$dir1" | sort > "$tmp"/dir1-sums
comm -23 "$tmp"/sd-sums "$tmp"/dir1-sums |\
sed 's/^[^ ]* .//'