find输出一个额外的空行

我使用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。