Як я можу шукати файл за його ім'ям та частковим шляхом?


64

Часто у мене є ім'я файлу, і це частковий шлях, наприклад, "content / docs / file.xml".

Чи існує простий спосіб пошуку цього файлу, не вручну розрізаючи його частини, щоб вказати ім'я каталогу та ім’я окремо?

Було б чудово, якби findпрацювали таким чином, тож я міг би бігти find content/docs/file.xml, але, на жаль, це не так.


1
Ви можете спробувати додати * wildcard на початку. find -path *content/docs/file.xmlпрацював на мене.
Боб

дякую, @Bob, це справді працювало для мене. До речі, цікаво, що якщо я додаю косу рису після зірочки: "find -path * / content / docs / file.xml", вона не працює. Все одно дякую.

також, @Bob, будь ласка, зробіть це як відповідь, і я позначу це як правильне.

Причина, що нахил після зірочки не спрацьовує, мабуть, тому, що зірочку слід було б уникнути, дивіться редагування моєї відповіді.
Боб

Відповіді:


72

Перейдіть у *підстановку, щоб вказати на відповідність будь-чому . Вам також потрібно уникнути *s, наприклад:

find . -path \*content/docs/file.xml

або додайте шаблон до лапок, наприклад:

find . -path "*content/docs/file.xml"

Як описується сторінка man:

$ знайти. -імен * .c -принт

find: шляхи повинні передувати вираженню

Це відбувається тому, що * .c було розширено оболонкою, що призводить до фактичного отримання командного рядка таким чином:

знайти. -ім'я bigram.c code.c frcode.c locate.c -print

Ця команда, звичайно, не спрацює. Замість того, щоб робити щось таким чином, слід укласти шаблон у лапки або вийти з шаблону:

$ знайти. -імен \ *. c -принт


10

find також має варіант -whoname find $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword

Я не знаю повного шляху, лише частковий, тому "ім'я імені" не працюватиме.

прапор вводить в оману, дивіться мій приклад ... він просто дозволяє поширити рядок у каталог, якщо ви це знаєте
технозавр

3
find . -type f | grep "content/docs/file.xml"

або просто

locate content/docs/file.xml

locate - це цікавий варіант, але він шукає весь диск, я хотів би мати можливість вказати базовий каталог пошуку або хоча б вказати за допомогою param, що пошук слід проводити з цього каталогу (як це робить ваш перший варіант) , а не від кореня.

1
@ user69817 - навпаки, locate не шукає диск, він запитує базу даних локалізації, яка зазвичай заповнюється через cron один раз на день.
тинк

1

Наприклад, пошук файлів у розташуванні за допомогою зірочки / підстановки ( *) як: dir=“/apps/*/instance01/" ви можете використовувати find ${dir} -name “*.jks”. поміщаючи всі файли в такий масив:

arr=(`find ${dir} -name “*.jks"`)

якщо ви хочете отримати файли з іншими розширеннями, використовуйте "або" так:

-name "*.keystore" -o -name "*.jks" -o -name “*.p12" тому що -nameприймає лише один рядок, тож використовуйте "або".

Нарешті складіть все у масив так:

arr=(`find ${dir} -name "*.keystore" -o -name "*.jks" -o -name "*.p12"`)

якщо у вас є повні шляхи, а не часткові шляхи, їх набагато простіше помістити в такі масиви:

arr=(“/Users/ajay/Documents/keystore_and_p12files/"*.{keystore,p12,jks})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.