Как я могу найти файл по его имени и частичному пути?

64

Часто у меня есть имя файла и его частичный путь, например, «content / docs / file.xml».

Есть ли простой способ поиска этого файла, не разрезая вручную на части его имя, чтобы отдельно указать имя каталога и имя файла?

Было бы замечательно, если бы я findработал таким образом, чтобы я мог бежать find content/docs/file.xml, но, к сожалению, это не так.

slhck
источник
1
Вы можете попробовать добавить подстановочный знак * в начале. find -path *content/docs/file.xmlработал на меня.
Боб
спасибо, @Bob, это действительно работает для меня. Кстати, интересно, что если я добавляю косую черту после звездочки: «find -path * / content / docs / file.xml», это не сработает. В любом случае, большое спасибо.
также, @Bob, пожалуйста, сделайте это как ответ, и я отмечу это как правильный.
Причина, по которой косая черта после звёздочки не сработала, возможно, в том, что звёздочку нужно было экранировать, см. Редактирование моего ответа.
Боб

Ответы:

73

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

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

или заключите шаблон в кавычки, например:

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

Как описано на странице руководства:

$ найти. -name * .c -print

find: пути должны предшествовать выражению

Это происходит потому, что оболочка * .c была расширена, в результате чего find фактически получает командную строку, например:

находить . имя bigram.c code.c frcode.c locate.c

Эта команда, конечно, не будет работать. Вместо того, чтобы делать это таким образом, вы должны заключить шаблон в кавычки или не использовать подстановочный знак:

$ найти. -name \ *. c -print

боб
источник
10

find также имеет опцию -wholename find $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword
technosaurus
источник
Я не знаю полный путь, только частичный, поэтому «-wholename» не будет работать.
флаг вводит в заблуждение, смотрите мой пример ... он просто позволяет вам расширить строку в каталог, если вы это знаете
technosaurus
3
find . -type f | grep "content/docs/file.xml"

или просто

locate content/docs/file.xml
Nifle
источник
locate - интересный вариант, но он ищет весь диск, я хотел бы иметь возможность указать базовый каталог поиска или, по крайней мере, указать с помощью param, этот поиск должен быть выполнен из этого каталога (как ваш первый вариант) не из корня.
1
@ user69817 - наоборот, locate не ищет диск, а запрашивает базу данных locate, которая обычно заполняется через cron раз в день.
Тинк
1

Например, поиск файлов в местоположении, используя звездочку / подстановочный знак ( *) как: dir=“/apps/*/instance01/" вы можете использовать поиск ${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})
user450631
источник