Я искал команду, которая будет возвращать файлы из текущего каталога, которые содержат строку в имени файла. Я видел locate
и find
команды, которые могут найти файлы, начинающиеся с чего-то first_word*
или заканчивающиеся чем-то *.jpg
.
Как я могу вернуть список файлов, которые содержат строку в имени файла?
Например, если 2012-06-04-touch-multiple-files-in-linux.markdown
был файл в текущем каталоге.
Как я могу вернуть этот файл и другие, содержащие строку touch
? Использование команды, такой какfind '/touch/'
man grep
, на второй -man find
. почему вы гуглите вместо того, чтобы использовать человека, я не знаю.Ответы:
Используйте
find
:find . -maxdepth 1 -name "*string*" -print
Он найдет все файлы в текущем каталоге (удалите,
maxdepth 1
если вы хотите, чтобы он был рекурсивным), содержащий «строку», и выведет его на экран.Если вы хотите избежать файла, содержащего ':', вы можете ввести:
find . -maxdepth 1 -name "*string*" ! -name "*:*" -print
Если вы хотите использовать
grep
(но я думаю, что нет необходимости, поскольку вы не хотите проверять содержимое файла), вы можете использовать:ls | grep touch
Но, повторяю,
find
это лучшее и более чистое решение для вашей задачи.источник
find
это очень мощный инструмент, он должен быть каким-то «длинным». :)-print
как это поведение по умолчанию и так.
как это папка по умолчанию, где он проверяет.find . -name "*string*"
Отлично работает тоже. Удаление.
выдает ошибку на моем конце. Еще раз спасибо @Zagorax.Используйте grep следующим образом:
-R
значит рекурсировать. Если вы не хотите заходить в подкаталоги, пропустите его.-i
означает «игнорировать регистр». Вы также можете попробовать это.источник
:
. Есть ли какой-нибудь способ удержать это? Использование опции возможно?grep -R "touch" . | cut -d ":" -f 2
grep -R "touch" . | cut -d ":" -f 1
(прости, должно быть, неправильно понял тебя).grep
либо возвращает файлы с содержимым и именами файлов, содержащими,touch
либо содержимым, содержащимtouch
, я не уверен, что это так, пока. Из возвращенного списка файлов половина содержитtouch
заголовок, а другая половина содержит текстtouch
, а не заголовок. Просто понял это.-maxdepth
Опция должна быть перед-name
опцией, как показано ниже.,источник
Это будет искать во всей
$HOME
(то есть/home/username/
) системе любые файлы с именем «hello.c» и отображать их пути:Тем не менее, это не будет соответствовать
HELLO.C
илиHellO.C
. Для сопоставления без учета регистра передайте-iname
параметр следующим образом:Пример выходов:
Передайте
-type f
опцию только для поиска файлов:-iname
Работает либо на GNU или BSD (включая OS X) команду версии поиска. Если ваша версия команды find не поддерживает-iname
, попробуйте следующий синтаксис с помощьюgrep
команды:ИЛИ попробуйте
Пример выходов:
источник
Если строка находится в начале имени, вы можете сделать это
источник
compgen
не подходит молоток для этого ногтя. Этот малоиспользуемый инструмент предназначен для вывода списка доступных команд и, как таковой, он перечисляет файлы в текущем каталоге (которые могут быть скриптами) и не может ни просматривать, ни просматривать начало имени файла, ни искать содержимое файла, что делает его в основном бесполезно.Альтернативой многим уже предоставленным решениям является использование глобуса
**
. Когда вы используетеbash
с опциейglobstar
(shopt -s globstar
) или используетеzsh
, вы можете просто использовать глобус**
для этого.выполняет рекурсивный поиск в каталоге для файлов с именем
bar
(возможно, включая файлbar
в текущем каталоге). Обратите внимание, что это не может быть объединено с другими формами смещений в пределах того же сегмента пути; в этом случае*
операторы возвращаются к своему обычному эффекту.Обратите внимание, что есть небольшая разница между
zsh
иbash
здесь. Покаbash
буду перебирать софт-ссылки на каталоги,zsh
не буду. Для этого вы должны использовать шар***/
вzsh
.источник
источник
источник