В 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'
Другие вопросы по тегам