Удалить изображения, которые находятся в одной папке, в другой папке - PullRequest
0 голосов
/ 06 июня 2019

У меня есть две папки, которые содержат изображения.(Скажем, папка 1 и 2)

Изображения в папке 2 являются подмножеством изображений в папке 1. Я хочу удалить изображения из папки 1, которыев папке 2.Как мне это сделать?

РЕДАКТИРОВАТЬ

Имена файлов в обеих папках совпадают

ОС - Ubuntu 16.04 LTS

Пожалуйста, попросите любую дополнительную информацию, которая требуется.

Ответы [ 3 ]

2 голосов
/ 06 июня 2019

Опция 1: файлы являются чистыми копиями с одинаковыми именами файлов

for file1 in dir1/*; do
    [[ -e "dir2/$(basename "$file1")" ]] && echo "$file1"
done

Опция 2: файлы являются чистыми копиями с идентичными именами файлов, но могли произойти измененияпосле копирования.

Следующее также проверяет содержимое

for file1 in dir1/*; do
    file2="dir2/$(basename "$file1")"
    [[ -e "$file2" ]] && cmp --silent "$file1" "$file2" && echo "$file1"
done

Опция 3: файлы являются копиями, но имена файлов могли измениться.

Взгляните на fdupes или вы можете сделать следующее:

checksums=$(md5sum dir2/* | awk '{printf substr($1,length($1)-32+1,32) OFS}')
for file1 in dir1/*; do
    md5sum=$(md5sum "$file1"| awk '{printf substr($1,length($1)-32+1,32)}')
    [[ "$checksums" =~ $md5sum ]] && echo "$file1"
done

В последнем примере мы делаем его немного громоздким, поскольку имена файлов с символами новой строки или забавными символами могут вводить символ вконтрольная сумма (ср. md5sum добавляет «\» к контрольной сумме )

примечание: замените echo "$file1" на rm "$file1" после проверки.

2 голосов
/ 06 июня 2019

Используйте find с \0 для анализа имен файлов с пробелами или переводами строки.

Найти все файлы в папке 1. Удалить их из папки 2 (игнорировать ошибки).

dir1=1
dir2=2
find "${dir1}" -type f -printf '%f\0' | xargs -0 -i rm "${dir2}"/{} 2>/dev/null
2 голосов
/ 06 июня 2019

Вот один из возможных способов:

  1. Вывести список и отсортировать все имена файлов в папках (найти)
  2. Сравнить списки, чтобы найти пересечение ( объединить )
  3. Удалить файлы файлов пересечений из папки 1 (rm)

1.

find /path/to/folder1 -type f  -printf '%f\n'|sort
find /path/to/folder2 -type f  -printf '%f\n'|sort

2.

join  <(find /path/to/folder1 -type f  -printf '%f\n'|sort ) <(find /path/to/folder2 -type f  -printf '%f\n'|sort))

3.Putting1. и 2. альтогетер:

for f in $(join  <(find /path/to/folder1 -type f  -printf '%f\n'|sort ) <(find /path/to/folder2 -type f  -printf '%f\n'|sort))
do 
 echo removing $f
 # uncomment below once you are satisfied with the list printed
 # rm "/path/to/folder1/$f"
done
...