Найти файл по совпадению на своем пути

У меня есть каталог, содержащий несколько подкаталогов. Каждый из этих подкаталогов содержит подкаталог, все из которых имеют одинаковое имя. Я хотел бы создать список всех этих файлов в командной строке. Например, если у меня есть:

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 , но я не совсем понял это. Трудно найти эту проблему, потому что она настолько специфична, и просто поиск «найти файл по совпадению на своем пути» не дает ничего полезного.

7
задан 15 May 2017 в 14:39

12 ответов

попробуйте это

find */subdir -type f
8
ответ дан 22 May 2018 в 22:36

попробуйте это

find */subdir -type f
8
ответ дан 18 July 2018 в 13:16

попробуйте это

find */subdir -type f
8
ответ дан 24 July 2018 в 20:08

Для этого вам действительно не нужно 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
8
ответ дан 22 May 2018 в 22:36

Лучшим обходным путем с 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 будет работать нормально.

2
ответ дан 22 May 2018 в 22:36

Просто используйте соответствующий инструмент:

locate "/subdir/"

Вы можете захотеть (повторно) запустить:

sudo updatedb

, если вам нужно обновить базу данных locate (например, если вы хотите найти недавно добавленные файлы), но он должен быть построен через crontabs каждый день (если компьютер работает в это время)

Если вам нужно исходное обновление b, оно может показаться медленнее, чем конкретная находка , но, в конце концов, это быстрее, поскольку все последующие запросы выполняются FAST.

1
ответ дан 22 May 2018 в 22:36

Просто используйте соответствующий инструмент:

locate "/subdir/"

Вы можете захотеть (повторно) запустить:

sudo updatedb

, если вам нужно обновить базу данных locate (например, если вы хотите найти недавно добавленные файлы), но он должен быть построен через crontabs каждый день (если компьютер работает в это время)

Если вам нужно исходное обновление b, оно может показаться медленнее, чем конкретная находка , но, в конце концов, это быстрее, поскольку все последующие запросы выполняются FAST.

1
ответ дан 18 July 2018 в 13:16

Лучшим обходным путем с 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 будет работать нормально.

2
ответ дан 18 July 2018 в 13:16

Для этого вам действительно не нужно 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
8
ответ дан 18 July 2018 в 13:16

Просто используйте соответствующий инструмент:

locate "/subdir/"

Вы можете захотеть (повторно) запустить:

sudo updatedb

, если вам нужно обновить базу данных locate (например, если вы хотите найти недавно добавленные файлы), но он должен быть построен через crontabs каждый день (если компьютер работает в это время)

Если вам нужно исходное обновление b, оно может показаться медленнее, чем конкретная находка , но, в конце концов, это быстрее, поскольку все последующие запросы выполняются FAST.

1
ответ дан 24 July 2018 в 20:08

Лучшим обходным путем с 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 будет работать нормально.

2
ответ дан 24 July 2018 в 20:08

Для этого вам действительно не нужно 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
8
ответ дан 24 July 2018 в 20:08

Другие вопросы по тегам:

Похожие вопросы: