find 输出一个额外的空行

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

如何摆脱多余的线条

答案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 +1leading 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

不要忘记附加/源路径和目标路径。

相关内容