Назад | Перейти на главную страницу

Как найти каталог, содержащий определенные файлы или каталоги?

Я ищу однострочную команду, которая находит несколько файлов или каталогов, содержащихся в одном каталоге.

foo -> bar
    -> baz
    -> quux

temp -> bar

Я ищу только найти foo потому что он содержит bar, baz, и quux, но не найти temp.

По другим причинам я вынужден использовать tcsh для этого.

Какие-либо предложения?

Это должно делать то, что вы хотите, и работать с предоставленными данными.

find . -type d -exec test -e '{}'/bar -a -e '{}'/baz -a -e '{}'/quux \;  -print

Он в основном находит каталоги, а затем проверяет, содержат ли они соответствующие файлы. Если они это сделают, он напечатает имя. Работает в bash и tcsh.

Один из способов сделать это, особенно если вам нужно узнать эту информацию несколько раз, - это mlocate. После установки mlocateты должен бежать sudo updatedb для заполнения базы данных индекса. Дальнейшая переиндексация запускается ежедневным заданием cron (которое настроено по умолчанию во многих популярных дистрибутивах Linux).

Когда у вас есть актуальный индекс, вы можете запускать такие запросы, как:

locate -r '^/.*/foo/\(bar\|baz\|quux\)$'

Приведенная выше команда будет искать все в корне (/) вниз и напечатайте что-то вроде:

/home/foo/bar
/home/foo/baz
/var/lib/foo/quux
/usr/local/foo/bar

Есть несколько способов найти ваши файлы. Один пример: найти каталог с именем «foo» и перечислить все, что находится внутри:

find . -name "foo" -type d | xargs ls -la

Другой вариант, если у вас есть treeкоманда установлена ​​(sudo apt-get install -y tree):

find . -name "foo" -type d | xargs tree -afi 

В -afiпредоставит вам все файлы (-a), полный путь к файлу (-f) и отбросьте отступ (-i).

Попробуйте найти все каталоги и посмотрите, содержат ли они ваши три файла / каталога:

find -type d -print0 | xargs -0 -I@@ sh -c '[ -e @@/a ] && [ -e @@/b ] && [ -e @@/c ] && echo @@'