знайти набір загальних файлів між кількома каталогами?


9

Я шукаю, щоб порівняти каталоги друпальської тематики. Drupal тема - це каталог, що складається з декількох файлів, і я намагаюся з’ясувати, які з них є важливими. Наприклад, усі вони можуть мати файл з назвою template.phpабо page.tpl.php.

Як я можу знайти набір усіх загальних файлів для кількох каталогів? У моєму випадку всі «однакові» файли (файли з тим самим іменем) будуть знаходитися в одному каталозі рівня.


У розділі "Головоломка з оболонками" є відповіді в розділі " ukuug.org/newsletter/10.4" (хоч вони з оболонкою).
Джеймс Янгмен

Відповіді:


7

Перерахуйте всі назви (не шляхи) файлів, спільних для всіх каталогів.

dirs=( "A dir" "B dir" "C dir" "D dir" )
find "${dirs[@]}" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *${#dirs[@]} //p"

Або назвіть це як скрипт-файл або функцію, каталоги - як параметри.

find "$@" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *$# //p"

1

Ви можете відобразити список імен, відсортованих за кількістю каталогів, у яких вони відображаються.

find */ |              # traverse all the template directories
sort -t / -k 2 |       # sort, ignoring the first field
tr '/' '\t' |          # turn / into tabs
uniq -f 1 -c |         # count duplicates, ignoring the first field
tr '\t' '/' |          # turn tabs back into /
sort -t / -s -k 1n     # sort by the number of occurrences

0

За допомогою Meld можна порівняти два каталоги та побачити, які файли присутні в одному, а не в іншому та навпаки. Він також може показати відмінності між загальними файлами.


0

Для трьох каталогів, один з яких є поточним, і два 'a' і 'b', ви можете ланцюг тесту так:

ls a/$(ls b/$(ls *.php) 2>/dev/null) 2>/dev/null

якщо файли мають загальну схему (наприклад, .php) і не містять пробілів у назви файлів.

Використовувати lsв сценаріях завжди проблематично, і я зазвичай відмовляю від його використання, але якщо у вас є огляд усіх файлів у каталозі, де починається пошук, і він не містить пробілу, ані спеціальних символів, таких як "*" чи "? "," <"або" | ", для його використання слід зберегти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.