Я хочу сравнить каталоги тем Drupal. Тема Drupal — это каталог, состоящий из нескольких файлов, и я пытаюсь выяснить, какие из них являются существенными. Например, все они могут иметь файл с именем template.php
или page.tpl.php
.
Как найти набор всех общих файлов для нескольких каталогов? В моем случае все «одинаковые» файлы (с одинаковым именем) будут находиться в каталоге одного уровня.
решение1
Перечислить все имена (не пути) файлов, общие для всех каталогов.
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"
решение2
Вы можете отобразить список имен, отсортированный по количеству каталогов, в которых они встречаются.
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
решение3
ССлияниеВы можете сравнить два каталога и посмотреть, какие файлы присутствуют в одном, а какие нет в другом и наоборот. Также можно показать различия между общими файлами.
решение4
Для трех каталогов, один из которых текущий, и два «a» и «b», вы можете связать тест следующим образом:
ls a/$(ls b/$(ls *.php) 2>/dev/null) 2>/dev/null
если файлы имеют общий шаблон (например, .php) и не содержат пробелов в именах файлов.
Использование ls
в скриптах всегда проблематично, и я обычно не рекомендую его использовать, но если у вас есть обзор всех файлов в каталоге, с которого начинается поиск, и он не содержит пробелов или специальных символов, таких как «*» или «?», «<» или «|», то его использование может быть безопасным.