У меня есть каталог, содержащий несколько подкаталогов. Каждый из этих подкаталогов содержит подкаталог, все из которых имеют одинаковое имя. Я хотел бы создать список всех этих файлов в командной строке. Например, если у меня есть:
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
Или, если вы хотите что-то сделать с этими файлами, а не просто перечислить их, используйте shell globs:
for file in */subdir/*; do command "$file"; done
Of конечно, что будет перечислять что-либо в любом подкаталоге, называемом subdir. Включая каталоги, символические ссылки, файлы устройств или что-то еще. Если вы хотите ограничить его обычными файлами, используйте find "*/subdir" -type f, как было предложено @Carl, или добавьте тест файла:
for file in */subdir/*; do [ -f "$file" ] && command "$file"; done
Лучшим обходным путем с 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 будет работать нормально.
Просто используйте соответствующий инструмент:
locate "/subdir/"
Вы можете захотеть (повторно) запустить:
sudo updatedb
, если вам нужно обновить базу данных locate (например, если вы хотите найти недавно добавленные файлы), но он должен быть построен через crontabs каждый день (если компьютер работает в это время)
Если вам нужно исходное обновление b, оно может показаться медленнее, чем конкретная находка , но, в конце концов, это быстрее, поскольку все последующие запросы выполняются FAST.
Просто используйте соответствующий инструмент:
locate "/subdir/"
Вы можете захотеть (повторно) запустить:
sudo updatedb
, если вам нужно обновить базу данных locate (например, если вы хотите найти недавно добавленные файлы), но он должен быть построен через crontabs каждый день (если компьютер работает в это время)
Если вам нужно исходное обновление b, оно может показаться медленнее, чем конкретная находка , но, в конце концов, это быстрее, поскольку все последующие запросы выполняются FAST.
Лучшим обходным путем с 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 будет работать нормально.
Для этого вам действительно не нужно 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
Или, если вы хотите что-то сделать с этими файлами, а не просто перечислить их, используйте shell globs:
for file in */subdir/*; do command "$file"; done
Of конечно, что будет перечислять что-либо в любом подкаталоге, называемом subdir. Включая каталоги, символические ссылки, файлы устройств или что-то еще. Если вы хотите ограничить его обычными файлами, используйте find "*/subdir" -type f, как было предложено @Carl, или добавьте тест файла:
for file in */subdir/*; do [ -f "$file" ] && command "$file"; done
Просто используйте соответствующий инструмент:
locate "/subdir/"
Вы можете захотеть (повторно) запустить:
sudo updatedb
, если вам нужно обновить базу данных locate (например, если вы хотите найти недавно добавленные файлы), но он должен быть построен через crontabs каждый день (если компьютер работает в это время)
Если вам нужно исходное обновление b, оно может показаться медленнее, чем конкретная находка , но, в конце концов, это быстрее, поскольку все последующие запросы выполняются FAST.
Лучшим обходным путем с 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 будет работать нормально.
Для этого вам действительно не нужно 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
Или, если вы хотите что-то сделать с этими файлами, а не просто перечислить их, используйте shell globs:
for file in */subdir/*; do command "$file"; done
Of конечно, что будет перечислять что-либо в любом подкаталоге, называемом subdir. Включая каталоги, символические ссылки, файлы устройств или что-то еще. Если вы хотите ограничить его обычными файлами, используйте find "*/subdir" -type f, как было предложено @Carl, или добавьте тест файла:
for file in */subdir/*; do [ -f "$file" ] && command "$file"; done