Найти файл, сопоставив его по пути

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

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

4 ответа

Вам на самом деле не нужно 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
0
ответ дан 15 May 2017 в 14:39

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

locate "/subdir/"

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

sudo updatedb

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

Если вам нужно начальное обновление b, оно может показаться медленнее, чем конкретный поиск, но в в конце концов, это намного быстрее, так как все последующие запросы выполняются БЫСТРО.

0
ответ дан 15 May 2017 в 14:39

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

find */subdir -type f
0
ответ дан 16 May 2017 в 00:39

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

0
ответ дан 16 May 2017 в 00:39

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

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