Как правило, ваше решение должно быть grep -w C
или grep -P '\bC\b'
, например roaima .
Чтобы игнорировать особые случаи, такие как C++
, вы всегда можете использовать отрицательный просмотр -вперед:
grep -P "\bC\b(?!\+)" file
(?!\+)
заставляет grep
игнорировать совпадение, если первый символ после C
является +
.
Если есть более конкретные случаи, вы можете просто отредактировать эту часть кода, чтобы они также соответствовали им.
Попробуйте составить список файлов без пути. Таким образом, вы можете сравнить два каталога. Однако имена файлов должны быть разными. Если у вас есть одно и то же имя файла, повторяющееся в dir1 в разных подкаталогах, удаление пути удалит уникальность имени файла. Вы можете получить список всех каталогов без таких путей:
find dir1/ -exec basename {} \; | sort
find dir2/ -exec basename {} \; | sort
Все вместе выглядело бы примерно так
diff <(find dir1/ -exec basename {} \; | sort) <(find dir2/ -exec basename {} \; | sort)
Я вижу комментарий, предлагающий использовать fdupes. fdupes
если определенно лучшее решение.
Грубый метод может использовать 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 и sha512sum
128.
уровень CYA :паранойя
Это может не работать в некоторых схемах кэширования, в которых метаданные хранятся в файлах , имена которых содержат хэш исходного файла .
(Это на самом деле произошло со мной несколько лет назад при установке Wordpress + Magento, когда мы хотели перенести огромный кеш статей, удалив при этом устаревшие записи ).
В этом случае вам придется использовать другую схему хеширования -быстрое исправление -, чтобы избежать grep
возврата ложных срабатываний, ошибочно принимая запись метаданных за исходный файл (, поэтому используйте SHA1, если кеш использует MD5 или наоборот ); или используя sed
, чтобы переписать все строки в «коротких» файлах, чтобы добавить «^» в начале, таким образом превратив его в привязанное регулярное выражение,и удаление флага -F
из grep
для обработки файла как регулярных выражений вместо простых строк.
Итак, частичное решение, которое я нашел, это:
find dir1 -type f | grep -vxFf <(fdupes -r dir1 dir2)
, но я говорю «частично», потому что если в dir1
есть дубликаты, они не будут показаны, поэтому сначала нужно запустить fdupes -r dir1
.