Найти файлы, которых нет в другом каталоге

Как правило, ваше решение должно быть grep -w Cили grep -P '\bC\b', например roaima .

Чтобы игнорировать особые случаи, такие как C++, вы всегда можете использовать отрицательный просмотр -вперед:

grep -P "\bC\b(?!\+)" file

(?!\+)заставляет grepигнорировать совпадение, если первый символ после Cявляется +.
Если есть более конкретные случаи, вы можете просто отредактировать эту часть кода, чтобы они также соответствовали им.

1
31.03.2020, 10:34
3 ответа

Попробуйте составить список файлов без пути. Таким образом, вы можете сравнить два каталога. Однако имена файлов должны быть разными. Если у вас есть одно и то же имя файла, повторяющееся в dir1 в разных подкаталогах, удаление пути удалит уникальность имени файла. Вы можете получить список всех каталогов без таких путей:

find dir1/ -exec basename {} \; | sort
find dir2/ -exec basename {} \; | sort

Все вместе выглядело бы примерно так

diff <(find dir1/ -exec basename {} \; | sort) <(find dir2/ -exec basename {} \; | sort)

Я вижу комментарий, предлагающий использовать fdupes. fdupesесли определенно лучшее решение.

2
19.03.2021, 02:31

Грубый метод может использовать md5sum. Только имейте в виду, что файлы с нулевой длиной всегда будут рассматриваться как дубликаты, поэтому вам может понадобиться findтолько файлы размером не менее одного байта.

find /first/path -type f -exec md5sum -b \{\} \; > /tmp/md5-path1.txt
cut -b1-32 < /tmp/md5-path1-short.txt
find /second/path -type f -exec md5sum -b \{\} \; > /tmp/md5-path2.txt
cut -b1-32 < /tmp/md5-path2-short.txt

Файлы в пути1, которых нет в пути2 (удалить параметр «-v»

grep /tmp/md5-path1.txt -v -F -f /tmp/md5/path2-short.txt

Уровень CYA :профессиональный

Число 32 выше связано с тем, что хэши MD5 имеют длину 32 байта. Если бы вы использовали, скажем, sha1sum, что имеет еще меньшую вероятность коллизий, тогда вы бы использовали длину 40; sha224sumтребует 56, sha256sumтребует 64 и sha512sum128.

уровень CYA :паранойя

Это может не работать в некоторых схемах кэширования, в которых метаданные хранятся в файлах , имена которых содержат хэш исходного файла .

(Это на самом деле произошло со мной несколько лет назад при установке Wordpress + Magento, когда мы хотели перенести огромный кеш статей, удалив при этом устаревшие записи ).

В этом случае вам придется использовать другую схему хеширования -быстрое исправление -, чтобы избежать grepвозврата ложных срабатываний, ошибочно принимая запись метаданных за исходный файл (, поэтому используйте SHA1, если кеш использует MD5 или наоборот ); или используя sed, чтобы переписать все строки в «коротких» файлах, чтобы добавить «^» в начале, таким образом превратив его в привязанное регулярное выражение,и удаление флага -Fиз grepдля обработки файла как регулярных выражений вместо простых строк.

0
19.03.2021, 02:31

Итак, частичное решение, которое я нашел, это:

find dir1 -type f | grep -vxFf <(fdupes -r dir1 dir2)

, но я говорю «частично», потому что если в dir1есть дубликаты, они не будут показаны, поэтому сначала нужно запустить fdupes -r dir1.

0
19.03.2021, 02:31

Теги

Похожие вопросы