Найти все файлы с именем string

Я искал команду, которая будет возвращать файлы из текущего каталога, содержащие строку в имени файла. Я видел команды 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.