我使用 find 命令来查找两个目录之间的公共文件:
find "$SOURCE" "$TARGET" -printf "$TARGET%P\n" | sort | uniq -d
问题是它总是在顶部输出一个空行。因此,当我尝试从源中删除公共文件时,如下所示:
find "$SOURCE" "$TARGET" -printf "$TARGET%P\n" | sort | uniq -d | xargs rm
我收到错误:
rm: cannot remove ‘/target/directory/path’: Is a directory
如何摆脱多余的线条
答案1
您应该避免xargs rm
在这里使用,因为这实际上会导致解析的输出ls
,即经典反模式。
相反,你可以做类似的事情:
for tgt in "$TARGET"/*; do
if [[ -e "$SOURCE/${tgt##*/}" ]]; then
rm "$tgt"
fi
done
当然,这不会递归,所以如果你想要这样做,你可以find
像这样使用:
find "$TARGET" -type f -exec bash -c 'if [ -e "${1//$TARGET/$SOURCE}" ]; then rm "$1"; fi' "" {} \;
或者显然有一个工具叫fdupes
听起来它可能对你有用
答案2
快速而肮脏 -> 添加tail -n +1
leading tofind "$SOURCE" "$TARGET" -printf "$TARGET%P\n" | tail -n +1 | sort | uniq -d | xargs rm
答案3
检查目录之间差异的更快捷的方法:
diff -qr "$source" "$target"
另一种解决方案是find
仅使用 专门请求文件-type f
。
您还可以使用 来抑制起点的打印-mindepth 1
。
答案4
尝试这个
SOURCE=folder1/ ;
TARGET=folder2/ ;
find "$SOURCE" "$TARGET" -type f -printf "$TARGET%P\n" | sort | uniq -d | xargs rm
不要忘记附加/
源路径和目标路径。