У меня есть каталог, содержащий несколько подкаталогов. Каждый из этих подкаталогов содержит подкаталог с одинаковыми именами. Я хотел бы создать список всех этих файлов в командной строке. Так, например, если у меня есть:
dir1/
file1.txt
subdir/
relevant_file1.c
relevant_file2.c
dir2/
file2.txt
subdir/
relevant_file3.txt
relevant_file4.java
dir3/
subdir/
relevant_file5.cpp
irrelevant_subdir/
unimportant_file.txt
dir4/
subdir/
Я хотел бы получить следующий вывод:
dir1/subdir/relevant_file1.c
dir1/subdir/relevant_file2.c
dir2/subdir/relevant_file3.txt
dir2/subdir/relevant_file4.java
dir3/subdir/relevant_file5.cpp
Полагаю, это не должно быть слишком сложно используя find
, но я не совсем смог понять это. Трудно найти эту проблему, потому что она настолько специфична, и просто поиск «найти файл по совпадению по его пути» не даст ничего полезного.
Вам на самом деле не нужно find
для этого. Простой ls
будет делать:
$ ls -1 */subdir/*
dir1/subdir/relevant_file1.c
dir1/subdir/relevant_file2.c
dir2/subdir/relevant_file3.txt
dir2/subdir/relevant_file4.java
dir3/subdir/relevant_file5.cpp
Или, если вы хотите что-то сделать с этими файлами, а не просто перечислить их, используйте оболочки оболочки:
for file in */subdir/*; do command "$file"; done
Конечно, это перечислит что-нибудь в любом подкаталоге с именем subdir
. Включая каталоги, символические ссылки, файлы устройств или что-либо еще. Если вы хотите ограничить его обычными файлами, используйте find "*/subdir" -type f
, как предложено @Carl , или добавьте тест файла:
for file in */subdir/*; do [ -f "$file" ] && command "$file"; done
Просто используйте соответствующий инструмент:
locate "/subdir/"
Вы можете (повторно) запустить:
sudo updatedb
, если вам нужно обновить базу данных локации (например, если вы хотите чтобы найти недавно добавленные файлы), но он должен собираться с помощью crontabs каждый день (если компьютер работает в это время)
Если вам нужно начальное обновление b, оно может показаться медленнее, чем конкретный поиск, но в в конце концов, это намного быстрее, так как все последующие запросы выполняются БЫСТРО.
Лучшее обходное решение с find
должно использовать -path
опция.
find -path "*/subdir/*" -type f
более полезно, когда у нас есть более сложная структура. что-то как:
.
├── dir1
│ ├── gooddir
│ │ └── subdir
│ │ └── file.txt
│ ├── irrelevant_subdir
│ │ └── file.txt
│ └── subdir
│ └── file.txt
└── dir2
├── gooddir
│ └── subdir
│ └── file.txt
├── irrelevant_subdir
│ └── file.txt
└── subdir
└── file.txt
В вышеупомянутом примере что-то как find */subdir -type f
только находит файлы в первом subdir
. Однако find -path "*/subdir/*" -type f
будет хорошо работать.