Вы можете использовать find
так:
find -type d -exec sh -c '[ -f "$0"/index.php ] && [ -f "$0"/style.css ]' '{}' \; -print
для поиска нескольких файлов, просто добавить их как && [ -f "$0"/other_file ]
. Код возврата sh
будет указывать, можно ли найти все файлы. Имя каталога будет напечатано только в том случае, если успешно завершил sh
, т. Е. Когда все файлы были найдены.
Тестирование это:
$ mkdir dir1
$ touch dir1/a
$ mkdir dir2
$ touch dir2/a
$ touch dir2/b
$ find -type d -exec sh -c '[ -f "$0"/a ] && [ -f "$0"/b ]' '{}' \; -print
./dir2
Здесь я создал две директории, dir1
и dir2
. dir2
содержит оба файла, поэтому его название печатается.
Как gniourf_gniourf упомянул в комментариях (спасибо), для этого не нужно использовать sh
. Вместо этого, вы можете сделать это:
find -type d -exec test -f '{}'/a -a -f '{}'/b \; -print
[
и test
делать то же самое. Этот подход использует -a
вместо &&
для объединения нескольких отдельных тестов, что уменьшает количество выполняемых процессов.
В ответ на ваш комментарий, вы можете добавить все каталоги найденных в архив, как это:
find -type d -exec test -f '{}'/a -a -f '{}'/b \; -print0 | tar --null -T - -cf archive.tar.bz2
Опция -print0
печатает имена каждого из каталогов, разделенных нулевым байтом. Это полезно, поскольку оно предотвращает проблемы с файлами, содержащими пробелы в их именах. Имена читаются tar
и добавляются в архив, сжатый в bzip. Обратите внимание, что некоторые версии find
не поддерживают опцию -print0
. Если ваша версия не поддерживает его, вы можете использовать -print
(и удалить опцию --null
до tar
), в зависимости от ваших имен каталогов.
Где список файлов, которые вы пытаетесь найти? – anubhava
index.php style.css page.php single.php Основные основные файлы comment.php, необходимые для wordpress по теме wordpress. Моя цель - найти все темы Wordpress, присутствующие в данной Linux-системе. –