我有两个目录,分别称为 thumb 和 thumb2。它们包含相同的文件名,但大小不同。不幸的是,thumb2 中的一些文件不在 thumb 中,需要将其删除。
$ ls ../thumb2 | wc -l
199030
$ ls ../thumb | wc -l
193455
我正在寻找一个命令行命令,它将从 thumb2 中删除所有不在 thumb 中的文件。
有人知道如何做到这一点吗?
答案1
我已经用小样本测试了这个解决方案,但在尝试之前请务必备份您的目录:
cd ../thumb2
for f in *; do test -e ../thumb/$f || echo rm $f; done
我没有包含数千个文件的目录,所以我不知道此命令是否适用于如此大的样本。请在备份目录后尝试一下。一旦您确定该命令正常工作,请删除该echo
命令。
更新
以下是 Glenn 的优秀解决方案的修改版本:
diff thumb thumb2 | \
while read field1 field2 dir filename; do
[[ $dir = "thumb2:" ]] && echo rm "thumb2/$filename"
done
答案2
您还可以调用diff
来检查目录内容:
diff thumb thumb2 |
while read line; do
case "$line" in
"Only in thumb2: "*) echo rm "thumb2/${line#*: }" ;;
esac
done
echo
如果您对它的运行满意,则可将其删除。