У меня есть две папки — FolderA и FolderB — каждая из которых содержит тысячи файлов, которые должны называться точно с таким же расширением до. В одной папке находятся файлы с расширением .jpg, а в другой — с расширением .txt.
Моя цель - найти любые файлы, которые есть в одном, но не в другом. Так, например, если FolderA содержит:
foo.jpg
bar.jpg
baz.jpg
и FolderB содержит:
foo.txt
baz.txt
qux.txt
Скрипт должен вернуть:
FolderA/bar.jpg
FolderB/qux.txt
Как можно было бы с помощью bash создать такой вывод, введя два отдельных каталога? Я надеялся каким-то образом изменить команду diff
, которая выдала бы вывод Only in ...
, но в этом случае, поскольку расширения разные, diff
выведет все файлы
diff -rq FolderA FolderB
Я пробовал только команду diff
Решил ли мой ответ или любой другой вашу проблему? Если это так, подумайте о том, чтобы принять его в качестве своего ответа, щелкнув пустую галочку рядом с подсчетом голосов. Если нет, скажите, что не сработало, чтобы я или кто-то еще мог вам помочь. Спасибо. meta.stackexchange.com/questions/5234/…
предположим, что ваши имена файлов не имеют специальных символов (например, .
или /
), этот awk «однострочный» выполнит эту работу:
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
вашими реальными именами каталоговЛюбить это! «Однострочник» всего с 4 переводами строки в нем :-)
Если ваш вывод diff -rq
хорош, но вы просто хотите, чтобы он был отформатирован по-другому, вы можете использовать sed
, чтобы изменить вывод:
diff -rq dir1 dir2 | sed 's/Only in //;s/: ///' | sort
Это при условии, что в имени ваших каталогов нет :
(двоеточия).
Это делает то, что вы просите, но сообщает результаты в 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 ...
Да, вы пробовали что-нибудь и столкнулись с конкретными проблемами?