Я искал команду, которая будет возвращать файлы из текущего каталога, содержащие строку в имени файла. Я видел команды locate
и find
, которые могут находить файлы, начинающиеся с чего-то first_word*
или заканчивающиеся чем-то *.jpg
.
Как я могу вернуть список файлов, содержащих строку в имени файла?
Например, если 2012-06-04-touch-multiple-files-in-linux.markdown
был файлом в текущем каталоге.
Как я могу вернуть этот файл и другие, содержащие строку touch
? Используя команду, например find '/touch/'
Ответ 1
Используйте find
:
find . -maxdepth 1 -name "*string*" -print
Он найдет все файлы в текущем каталоге (удалите maxdepth 1
, если вы хотите, чтобы он был рекурсивным), содержащий строку, и напечатает его на экране.
Если вы хотите избежать файла, содержащего ':', вы можете ввести:
find . -maxdepth 1 -name "*string*" ! -name "*:*" -print
Если вы хотите использовать grep
(но я думаю, что это не обязательно, если вы не хотите проверять содержимое файла), вы можете использовать:
ls | grep touch
Но, повторяю, find
- лучшее и более чистое решение для вашей задачи.
Ответ 2
Используйте grep следующим образом:
grep -R "touch" .
-R
означает recurse. Если вы предпочитаете не входить в подкаталоги, пропустите его.
-i
означает "игнорировать регистр". Возможно, вам стоит попробовать.
Ответ 3
Параметр -maxdepth
должен быть перед параметром -name
, как показано ниже.
find . -maxdepth 1 -name "string" -print
Ответ 4
find $HOME -name "hello.c" -print
Это приведет к поиску всей системы $HOME
(т.е. /home/username/
) для любых файлов с именем "hello.c" и отобразит их пути:
/Users/user/Downloads/hello.c
/Users/user/hello.c
Однако он не будет соответствовать HELLO.C
или HELLO.C
. Для соответствия нечувствительности к регистру, передайте параметр -iname
следующим образом:
find $HOME -iname "hello.c" -print
Выборочные выходы:
/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c
Передайте параметр -type f
только для поиска файлов:
find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print
-iname
работает либо в команде поиска GNU, либо в BSD (включая OS X). Если ваша версия команды find не поддерживает -iname
, попробуйте использовать следующий синтаксис с помощью команды grep
:
find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"
ИЛИ попробуйте
find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print
Выборочные выходы:
/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c
Ответ 5
Если строка находится в начале имени, вы можете сделать это
$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt
Ответ 6
grep -R "somestring" | cut -d ":" -f 1
Ответ 7
Альтернативой многим уже предоставленным решениям является использование glob **
. Когда вы используете bash
с опцией globstar
(shopt -s globstar
), или вы используете zsh
, вы можете просто использовать glob **
для этого.
**/bar
рекурсивный поиск каталога для файлов с именем bar
(потенциально включая bar
файла в текущем каталоге). Заметим, что это невозможно комбинировать с другими формами глобусов в одном и том же сегменте пути; в этом случае операторы *
возвращаются к их обычному эффекту.
Обратите внимание, что здесь есть тонкая разница между zsh
и bash
. В то время как bash
будет перемещать софт-ссылки в каталоги, zsh
не будет. Для этого вам нужно использовать glob ***/
в zsh
.