В bash найти все файлы в плоском каталоге, которые не существуют в другом дереве каталогов
У меня много файлов в каталоге A
,
Некоторые из этих файлов существуют в дереве каталогов с подкаталогами B/B1
, B/B2
, B/B3
, B/B4
Обратите внимание, что в некоторых файлах есть пробелы в именах.
Например:
в каталоге A
:
- есть файл с именем
A/red file.png
есть еще один по имени
A/blue file.png
и в дереве каталогов
B
:есть файл с именем
B/small/red file.png
В этом примере я хотел бы сценарий, чтобы сказать мне, что файл
blue file.png
не существует в каталогеB
,
Как я могу написать скрипт, который будет перечислять все файлы в A
которые не найдены в дереве каталогов B
?
1 ответ
Решение
# A
# ├── blue file.png
# └── red file.png
# B
# └── small
# └── red file.png
$ comm -23 <( find A -type f -printf '%f\n' | sort | uniq ) <( find B -type f -printf '%f\n' | sort | uniq )
blue file.png
Если твой find
не хватает -printf
, ты можешь попробовать:
comm -23 <( find A -type f -exec basename {} \; | sort | uniq ) <( find B -type f -exec basename {} \; | sort | uniq )
Это версия, которая может работать со всеми именами файлов, включая те, которые содержат символы новой строки:
comm -z23 <(find dir1 -type f -printf '%f\0' | sort -uz) <(find dir2 -type f -printf '%f\0' | sort -uz) | xargs -0 printf '%s\n'