Найдите несоответствующие файлы в двух папках с помощью bash - PullRequest
1 голос
/ 29 мая 2019

У меня есть две папки - FolderA и FolderB - каждая из которых содержит тысячи файлов, имена которых должны быть точно такими же перед расширением. Одна папка содержит файлы с расширением .jpg, а другая - с расширением .txt.

Моя цель - найти любые файлы, которые находятся в одном, но не в другом. Так, например, если FolderA содержит:

foo.jpg
bar.jpg
baz.jpg

и Папка B содержит:

foo.txt
baz.txt
qux.txt

Скрипт должен вернуть:

FolderA/bar.jpg
FolderB/qux.txt

Как было бы возможно с bash создать такой вывод, введя две отдельные директории? Я надеялся как-то изменить команду diff, которая выдаст вывод Only in ..., но в этом случае, поскольку расширения отличаются, diff выведет все файлы

diff -rq FolderA FolderB

Ответы [ 3 ]

1 голос
/ 29 мая 2019

Это делает то, что вы просите, но сообщает результаты в 3 столбцах - уникальные для первого каталога, уникальные для второго и общие для обоих:

comm <(cd FolderA && printf "%s\n" *.jpg | sed 's/.jpg$//') <(cd FolderB && printf "%s\n" *.txt | sed 's/.txt$//')

Пример вывода

bar
        baz
        foo
    qux

Можно отменить печать столбца 3 с помощью:

comm -3 ...
1 голос
/ 29 мая 2019

предполагается, что ваши имена файлов не имеют специальных символов (например, . или /), этот awk "one-liner" сделает свою работу:

awk -F'[./]' 'NR==FNR{a[$(NF-1)]=$0;next}
        $(NF-1) in a{delete a[$(NF-1)];next}
        {print}END{for(x in a)print a[x]}' 
       <(find DIR1/ -name *.jpg) 
       <(find DIR2/ -name *.txt)
  • вы заменитеDIR1 и DIR2 по вашим настоящим именам каталогов
  • , если ваши имена файлов содержат специальные символы , вам нужно заключить в кавычки имена файлов или просто вырезать суффикс.Но это детали реализации, и это не сложно.Этот ответ показывает вам направление для решения проблемы.
0 голосов
/ 29 мая 2019

Если ваш вывод diff -rq хорош, но вы просто хотите, чтобы он был отформатирован по-другому, вы можете использовать sed, чтобы изменить вывод:

diff -rq dir1 dir2 | sed 's/Only in //;s/: /\//' | sort 

Это означает, что ваши каталоги не имеют: (двоеточие) в их названии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...