Eu tenho procurado por um comando que retornará arquivos do diretório atual que contêm uma string no nome do arquivo. Eu vi locate
e find
comandos que podem encontrar arquivos começando com algo first_word*
ou terminando com algo *.jpg
.
Como posso retornar uma lista de arquivos que contêm uma string no nome do arquivo?
Por exemplo, se 2012-06-04-touch-multiple-files-in-linux.markdown
havia um arquivo no diretório atual.
Como eu poderia retornar esse arquivo e outros que contenham a string touch
? Usando um comando comofind '/touch/'
linux
unix
command-line
locate
Dru
fonte
fonte
man grep
, a segunda comman find
. Por que você pesquisaria no Google em vez de usar o homem, não sei.Respostas:
Use
find
:find . -maxdepth 1 -name "*string*" -print
Ele encontrará todos os arquivos no diretório atual (exclua
maxdepth 1
se desejar, recursivo) contendo "string" e imprimi-lo na tela.Se você quiser evitar o arquivo que contém ':', digite:
find . -maxdepth 1 -name "*string*" ! -name "*:*" -print
Se você quiser usar
grep
(mas acho que não é necessário, desde que você não queira verificar o conteúdo do arquivo), você pode usar:ls | grep touch
Mas, repito,
find
é uma solução melhor e mais limpa para sua tarefa.fonte
find
é uma ferramenta muito poderosa, deve ser de alguma forma 'longa'. :)-print
pois esse é o comportamento padrão e.
a pasta padrão em que ele verifica.find . -name "*string*"
Funciona muito bem também. Remover.
gera um erro do meu lado. Mais uma vez obrigado @Zagorax.Use grep da seguinte maneira:
-R
significa recuar. Se você preferir não entrar nos subdiretórios, pule-o.-i
significa "ignorar maiúsculas e minúsculas". Você pode achar que vale a pena tentar também.fonte
:
. Existe alguma maneira de reter isso? Usando uma opção, talvez?grep -R "touch" . | cut -d ":" -f 2
grep -R "touch" . | cut -d ":" -f 1
(desculpe, deve ter interpretado mal você).grep
ou retorna arquivos com conteúdo e nomes de arquivos que contêmtouch
ou que contêmtouch
, ainda não tenho certeza de qual é o caso. Da lista de arquivos retornados, metade contémtouch
no título e a outra metade contémtouch
no corpo, não o título. Apenas percebi isso.A
-maxdepth
opção deve estar antes da-name
opção, como abaixo.,fonte
Isso pesquisará todo o sistema
$HOME
(ie/home/username/
) por qualquer arquivo chamado “hello.c” e exibirá seus nomes de caminho:No entanto, não corresponderá
HELLO.C
ouHellO.C
. Para corresponder à distinção entre maiúsculas e minúsculas, passe a-iname
opção da seguinte maneira:Saídas de amostra:
Passe a
-type f
opção para procurar apenas arquivos:O
-iname
funciona tanto on GNU ou BSD (incluindo OS X) de comando versão achado. Se sua versão do comando find não suportar-iname
, tente a seguinte sintaxe usando ogrep
comando:OU tente
Saídas de amostra:
fonte
Se a sequência estiver no início do nome, você poderá fazer isso
fonte
compgen
não é um martelo apropriado para esta unha. Essa ferramenta pouco usada foi projetada para listar comandos disponíveis e, como tal, lista arquivos no diretório atual (que podem ser scripts) e não pode recursar nem olhar além do início de um nome de arquivo nem pesquisar o conteúdo do arquivo, tornando-o principalmente inútil.Uma alternativa para as muitas soluções já fornecidas é fazer uso do glob
**
. Quando você usabash
com a opçãoglobstar
(shopt -s globstar
) ou utilizazsh
, você pode simplesmente usar o glob**
para isso.faz uma busca recursiva de diretório por arquivos nomeados
bar
(incluindo potencialmente o arquivobar
no diretório atual). Observe que isso não pode ser combinado com outras formas de globbing no mesmo segmento de caminho; nesse caso, o*
operadores retornam ao seu efeito usual.Observe que há uma diferença sutil entre
zsh
ebash
aqui. Enquantobash
atravessará links diretos para diretórios,zsh
não passará. Para isso, você tem que usar o glob***/
nozsh
.fonte
fonte
fonte