Respostas:
Para concluir as respostas existentes:
ls
O utilitário de lista de diretórios padrão ls
pode ser usado em combinação com os curingas do shell. Para procurar todos os arquivos com padrão abc
:
ls abc* # list all files starting with abc---
ls *abc* # list all files containing --abc--
ls *abc # list all files ending with --abc
Observe que a extensão do arquivo também é relevante para os resultados da pesquisa.
tree
No caso de precisarmos listar arquivos em uma árvore de diretórios, também podemos emitir tree
para procurar um determinado padrão como:
tree -P 'abc*' # list directory tree of file starting with abc---
tree -l 'def*' # exclude files starting with def---
Nesse caso, tree
ele próprio suporta caracteres curinga.
ls
para listar um diretório, ele é aberto, é o mesmo que fazer ls -l BirthdayPhotos
. Você pode suprimir esse comportamento com ls -d B*
.
B*
como uma especificação de diretório?
B*
expande para corresponder a todos os diretórios iniciados, B
para que você realmente passe ls
uma lista de diretórios, abre todos eles para você.
ls -d ABC*
era sobre o que o autor estava perguntando. Os comentários no snippet de código também estão incorretos e ls abc*
lista o conteúdo dos diretórios que começam com abc.
Você pode usar o find
comando para procurar arquivos com padrão
find . -type f -name "abc*"
O comando acima pesquisará o arquivo que começa com abc no diretório de trabalho atual.
-name 'abc'
listará os arquivos que correspondem exatamente. Por exemplo: abc
Você também pode usar
-iname
-regex
opção com o find
comando para pesquisar o nome do arquivo usando um padrão
Existem várias maneiras de fazer isso, dependendo exatamente do que você deseja fazer com elas. Geralmente, se você quiser apenas listá-las, poderá fazê-lo em um terminal usando:
find | grep '^\./ABC'
... e substituindo ABC
pelo seu texto.
Para entender o comando, vamos dividir um pouco:
find
lista todos os arquivos no diretório atual e seus subdiretórios; usá-lo sozinho irá listar tudo o que estiver lá. Observe que find
gera cada arquivo ou diretório começando com ./
, indicando que seu caminho é relativo ao diretório atual. Estar ciente disso é importante porque significa que procuraremos resultados começando com ./ABC
e não apenas ABC
.
O caractere de pipe |
redireciona a saída de um comando para outro; nesse caso, a saída de find
é redirecionada para grep
. Isso é chamado de tubulação.
grep
pega a saída e a filtra usando o padrão fornecido ^\./ABC
,.
' '
para impedir que o shell interprete os caracteres especiais dentro dele.Agora, o próprio padrão é escrito em uma sintaxe específica chamada expressão regular , ou regex , abreviando . O Regex é uma ferramenta de pesquisa extremamente poderosa, se você o dominar, e existem sites como este que o ensinam com mais profundidade, mas observe que esse grep
não é um mecanismo de regex completo e você não pode fazer tudo com ele.
Para o nosso propósito:
^
em regex corresponde ao início da string; isso evita que ele corresponda ao padrão, se não ocorrer no início do nome do arquivo.
.
em regex também tem um significado especial: significa "corresponder a qualquer caractere único aqui". Caso você queira usá-lo como um ponto literal, será necessário "escapá-lo" usando uma barra invertida \
antes dele. (Sim, combinar qualquer personagem seria inofensivo no nosso caso, mas eu fiz isso por uma questão de perfeição.)
find | grep
quando find
seus próprios recursos de correspondência de padrões perfeitamente bons?
você pode usar o GREP, acho que essa é a solução mais simples, provavelmente também adicione outros parâmetros de grep para tornar a correspondência mais precisa
tree | grep ABC
Você pode procurar um padrão específico usando o gerenciador de arquivos do Nautilus e expressões regulares.
Para fazer isso, clique em Selecionar itens correspondentes no menu de engrenagem como abaixo (você também pode pressionar Ctrl+ s).
Em seguida, basta digitar a expressão regular ABC*
e validar.
Todo arquivo cujo nome corresponde ao seu padrão será selecionado automaticamente.
Estou usando o Nautilus 3.6. * Do GNOME3 PPA no Ubuntu 12.10 (Quantal).
A solução mais fácil para mim
ls | grep PATTERN
Aqui você pode dar qualquer expressão regular no PATTERN.
Por exemplo, para encontrar arquivos com "ab" em qualquer lugar dentro de seu nome, digite
ls | grep ".*ab.*"
Para localizar os arquivos começando com "ab", digite
ls | grep "^ab"
Se você não souber o diretório em que os ABC*
arquivos estão localizados e tiver milhões de arquivos, o locate
comando é o método mais rápido.
$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
Notas:
find
comando que começa no /
diretório raiz demora muito e gera muitos erros de permissão.sudo updatedb
primeiro.eu uso
ls | grep abc
ou
ls -la | grep abc
Ele mostra todos os arquivos com abc, não apenas começando com abc. Mas, é uma maneira muito fácil para mim fazer isso.
Pitão:
$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'
Perl:
$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name },".")'
printf "%s" /path/to/files/ABC*
É a correspondência de padrões globais, ancorada nas duas extremidades. Isso corresponderá a todas as ocorrências de arquivos que começam com "ABC", como "ABC", "ABC.txt", "ABC123", mas não com "xABC". Na linha de comando, usando 'ls' no lugar de 'printf', existe uma alternativa segura, porém, dependendo da opinião de quem você concorda, 'ls' não é seguro para uso em um script. Nesse caso, usar 'printf' com correspondência de padrões glob é considerado seguro. Se você usar isso em um script, a saída de 'printf' não conterá um novo caractere de linha até o final do fluxo de saída, como tal:
printf "%s" /path/to/files/ABC*
Devoluções:
/path/to/files/ABC /path/to/files/ABC123
Se você precisar de quebras de linha após cada instância:
printf "%s\n" /path/to/files/ABC*
Devoluções:
/path/to/files/ABC
/path/to/files/ABC123
"/ caminho / para / arquivos /" permanece na saída se você a inseriu dessa maneira ao executar o comando 'printf'. Sem ele, apenas o nome do arquivo aparece:
printf "%s" ABC*
Devoluções
ABC ABC123
Supondo que você execute o comando no diretório em que os arquivos existem.
echo /path/to/files/ABC* | tr " " "\n"
é uma boa ideia. Considere se existe um arquivo /path/to/files/ABC EFG
, há um espaço no nome do arquivo. Você tr
dividirá o nome do arquivo em duas linhas separadas, o que não é bom. Pior ainda, se houver vários espaços no nome do arquivo. Eu recomendo que você use printf "%s\n" ABC*
em vez disso, o que deve ajudar com espaços nos nomes de arquivos, mas ainda é problemático com outros caracteres especiais como\n
Command-t em um dos meus plugins favoritos do vim, é um plugin baseado em rubi acima da integração com o FZF.
Usando Comamnd-T e FZF, você pode fazer a pesquisa com um mecanismo "difuso" extremamente rápido para:
Como você pode ver
Eu sempre procuro no histórico de comandos abrindo um novo terminal e pressione:
CTRL+R
Além de procurar em todas as pastas recursivamente, escrevendo em qualquer guia do terminal:
fzf
Então inicie o seu nome de arquivo
ABC
Além disso, você pode escrever dentro vim
:CommandT
Realmente útil, especialmente em pastas grandes.
Suponha que eu esteja no diretório raiz e deseje apenas a lista do diretório etc: escrevemos,
find -type d -name "etc"
resultado que obtemos,
[root@unix /]# find -type d -name "etc"
./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc
Outro exemplo,
Também podemos escrever:
ls | grep "etc"
Nós temos,
etc
ls -l B*
mostro o conteúdo de todos os diretórios começando com, emB
vez de apenas os nomes dos diretórios correspondentes?