我使用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
如何摆脱多余的线
你应该避免在这里使用xargs rm ,因为这会导致essentaillyparsingls的输出,这是一个典型的反模式 。
相反,你可以这样做:
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的工具,听起来像可能为你做的工作
快速和肮脏 – >添加tail -n +1 find "$SOURCE" "$TARGET" -printf "$TARGET%P\n" | tail -n +1 | sort | uniq -d | xargs rm tail -n +1导致find "$SOURCE" "$TARGET" -printf "$TARGET%P\n" | tail -n +1 | sort | uniq -d | xargs rm find "$SOURCE" "$TARGET" -printf "$TARGET%P\n" | tail -n +1 | sort | uniq -d | xargs rm
检查目录之间差异的更快捷的方法是:
diff -qr "$source" "$target"
另一个解决方法是仅通过使用-type f来查询文件。
您也可以通过使用-mindepth 1来禁止打印起点。
尝试这个
SOURCE=folder1/ ; TARGET=folder2/ ; find "$SOURCE" "$TARGET" -type f -printf "$TARGET%P\n" | sort | uniq -d | xargs rm
不要忘记附加/源和目标path。