Я ищу однострочную команду, которая находит несколько файлов или каталогов, содержащихся в одном каталоге.
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 @@'