Qual é o equivalente do Linux ao DOS "dir / s / b filename"?

17

Liste todos os arquivos / diretórios no diretório atual ou abaixo dele que correspondem a 'filename'.

mackenir
fonte

Respostas:

28

O equivalente direto é

find . -iname <filename>

que listará todos os arquivos e diretórios chamados <filename>no diretório atual e todos os subdiretórios, ignorando o caso.

Se a sua versão do find não suportar -iname, você poderá usá-lo -name. Observe que -iname, diferentemente , diferencia -namemaiúsculas de minúsculas.

Se você deseja apenas listar arquivos chamados <filename>, e não diretórios, adicione-type f

find . -iname <filename> -type f

Se você quiser usar caracteres curinga, precisará colocar aspas, por exemplo,

find . -iname "*.txt" -type f

caso contrário, o shell o expandirá.

Como outros já apontaram, você também pode:

find . | grep "\.txt$"

grep imprimirá linhas com base em expressões regulares, mais poderosas que curingas, mas com uma sintaxe diferente.

Veja man finde man greppara mais detalhes.

Mikel
fonte
3
Se <filename>contiver caracteres curinga, use aspas, por exemplo find . -name '*.txt'.
Gilles 'SO- stop be evil'
@ Gilles, atualizei minha resposta para dizer isso, obrigado.
Mikel
2
Usar <filename>como marcador para a entrada do usuário é um mau hábito no ambiente de linha de comando, onde na < and >maioria das vezes tem um significado específico. Sugiro que você use filename, talvez FILENAME, para enfatizá-lo. A maioria das pessoas entenderá, e aquelas que não entenderão poderão causar danos se não entenderem que não devem atingir um sinal menor ou maior.
usuário desconhecido
2
<filename>é uma convenção em grande parte da documentação do UNIX, por isso acho útil que as pessoas estejam cientes disso, mas concordo que FILENAMEpode ser mais fácil de entender.
Mikel
1
find -iname <filename>é melhor uma vez que é case-insensitive como DOS
Agnel Kurian
8

Algumas conchas permitem ls **/filename, o que é bastante conveniente.

Shawn J. Goff
fonte
1
Bom ponto. Nas versões recentes do bash, a execução shopt -s globstar; echo **/filenameé equivalente a find . -name "filename". Também funciona no zsh.
Mikel
Este 'ls ** / filename` é bom, mas parece não ter mais do que um nível de diretório.
Sopalajo de Arrierez
@ sopalajo-de-arrierez Se você o fizer shopt -s globstar, provavelmente funcionará para você. O globbing recursivo é um recurso que está disponível apenas em alguns shells e, às vezes, não está ativado por padrão.
Shawn J. Goff
Ops ... Entendo agora, @ ShawnJ.Goff: o shoptcomando ativa a opção globstar on. agora isso trabalha como charme. Muito obrigado.
Sopalajo de Arrierez
4

Você pode fazer isso com

find . | egrep filename
Matten
fonte
1
Você também pode fazer isso de uma só vez find . -regextype posix-egrep -regex '.*filename.*'(não sei se a egrepparte é importante, mas você usou egrepsua resposta, então eu a incluí)
Michael Mrozek
Você pode, mas o grep é diferente do comando equivalente do DOS. grepusa expressões regulares, enquanto o comando do DOS usa caracteres curinga do shell.
Mikel
1
Venha para pensar sobre isso, os globs de shell também são diferentes dos curingas do DOS. Por exemplo, find . -name "*.*"não fará o que você esperaria de um plano de fundo do DOS. Os globos estão próximos o suficiente para serem reconhecidos, enquanto as expressões regulares são um animal totalmente novo.
Jander
O que *.*.*faz em um DOS moderno, como o Windows cmd? Que tal *.*.*.*?
Ctrl-alt-delor
0

Também pode ser: tree -if </your/path>ou 'pwd'como um caminho

Michael Fatahov
fonte