Назад | Перейти на главную страницу

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 здесь, поскольку это приводит, по существу, к синтаксическому анализу вывода 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 это звучит так, как будто это может сделать работу за вас

Более быстрый способ проверить различия между каталогами:

diff -qr "$source" "$target"

Другое решение - спросить find специально для файлов только с помощью -type f.

Вы также можете подавить печать начальных точек, используя -mindepth 1.

Быстро и грязно -> добавить tail -n +1 ведущий к find "$SOURCE" "$TARGET" -printf "$TARGET%P\n" | tail -n +1 | sort | uniq -d | xargs rm

попробуй это

SOURCE=folder1/ ;
TARGET=folder2/ ;
find  "$SOURCE" "$TARGET" -type f -printf "$TARGET%P\n" | sort | uniq -d | xargs rm

Не забудьте добавить / в исходном и целевом пути.