Я использую команду 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
Не забудьте добавить /
в исходном и целевом пути.