Como encontrar apenas arquivos em um determinado diretório e ignorar subdiretórios usando o bash

129

Eu olhei para outras questões semelhantes, mas não encontrei uma que me permitisse entender o conceito e torná-lo aplicável à minha situação com base no meu tempo limitado. Estou simplesmente executando o comando find para encontrar certos arquivos, mas alguns arquivos nos subdiretórios têm o mesmo nome que eu quero ignorar. Obrigado por qualquer ajuda. Abaixo está o comando que estou usando:

Os arquivos / padrão em que estou interessado: / dev / abc-scanner, / dev / abc-cash ....

O comando:

find /dev/ -name 'abc-*'

O que está sendo retornado:

/dev/abc-scanner
/dev/abc-cash
...
...
...
/dev/.udev/names/abc-scanner
/dev/.udev/names/abc-cash

Quero ignorar os últimos arquivos: /dev/.udev / ...

Suficiente
fonte
9
ignorar subdiretórios específicos ou não descer para nenhum subdiretório? Para o último, use a opção -maxdepth 1
frankc 10/10/11
@frankc Poste-o como resposta.
cnicutar 10/10
possível duplicata do diretório
Restabelecer Monica Por favor,

Respostas:

202

Se você apenas deseja limitar a localização ao primeiro nível, pode:

 find /dev -maxdepth 1 -name 'abc-*'

... ou se você deseja excluir particularmente o .udevdiretório, pode:

 find /dev -name '.udev' -prune -o -name 'abc-*' -print
Mark Longair
fonte
Se eu quisesse listar onde todos os links simbólicos acima apontam para o padrão acima, eu usaria apenas um pipe? Algo como find / dev -maxdepth 1 -name 'abc- *' | ls -l
suffa
1
É melhor usar xargs em vez disso, então algo como: find /dev -maxdepth 1 -name 'abc-*' | xargs ls -lmas se há alguma chance de que eles vão ter espaços em branco nos nomes, você deve fazerfind /dev -maxdepth 1 -name 'abc-*' -print0 | xargs -0 ls -l
Mark Longair
No entanto, como a resposta de Stephen Darlington aponta , não sei por que você não faria isso #ls -l /dev/abc-*
Mark Longair 10/10
Além disso, se você quiser descobrir para onde os links simbólicos apontam, você pode fazê-lo #for x in /dev/abc-*; do readlink -f $x; done
Mark Longair 10/10
1
Ou se você deseja subdiretórios apenas no primeiro nível, ls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev... exceto pelo menos no meu Linux /dev/*/*, não inclui arquivos /dev/.udev/*para que você possa omitir ofgrep -v .
tripleee
9

Existe algum motivo específico que você precisa usar find? Você pode apenas usar lspara encontrar arquivos que correspondam a um padrão em um diretório.

ls /dev/abc-*

Se você precisar usar find, poderá usar a -maxdepth 1opção para aplicar apenas ao diretório especificado.

Stephen Darlington
fonte
Eu acho que você quer dizer -maxdepth 1, em vez de-maxdepth 0
Mark Longair
5
Deve-se salientar que o curinga é a parte importante aqui, não ls. Você pode encontrar os mesmos arquivos com echoou wco que você tem, porque o shell expande o curinga para você. Assim for file in /dev/abc-*; do something with each "$file"; donepode ser o que o OP é realmente procurando.
Tripleee 10/10
1
Ah, nunca consigo me lembrar de que lado é ... Obrigado pela edição. Além disso, vale a pena notar que não é universal. A versão do Solaris findnão a possui, por exemplo.
Stephen Darlington
@tripleee +1. Sim. Fazer tudo isso no shell seria preferível, se possível.
Stephen Darlington
1
@MustafaOzturk The lsé supérfluo. for f in abc*; ...é tudo o que você precisa.
Stephen Darlington
4

Isso pode fazer o que você deseja:

find /dev \( ! -name /dev -prune \) -type f -print
Chris J
fonte
2
Sim, isso funciona. -maxdepth não é implementado no find em alguns Unixes mais antigos.
CCTO
-1
find /dev -maxdepth 1 -name 'abc-*'

Nao funciona para mim. Não retorna nada. Se eu apenas fizer '.' ele me fornece todos os arquivos no diretório abaixo daquele em que estou trabalhando.

find /dev -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls

Não retorne nada com '.' em vez disso, recebo uma lista de todos os arquivos 'grandes' no meu diretório, bem como do diretório rootfiles / onde eu armazeno os antigos.

Continuando. Isso funciona.

find ./ -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls
564751   71 -rw-r--r--   1 snyder   bfactory   115739 May 21 12:39 ./R24eTightPiPi771052-55.root
565197  105 -rw-r--r--   1 snyder   bfactory   150719 May 21 14:27 ./R24eTightPiPi771106-2.root
565023   94 -rw-r--r--   1 snyder   bfactory   134180 May 21 12:59 ./R24eTightPiPi77999-109.root
719678   82 -rw-r--r--   1 snyder   bfactory   121149 May 21 12:42 ./R24eTightPiPi771098-10.root
564029  140 -rw-r--r--   1 snyder   bfactory   170181 May 21 14:14 ./combo77v.root

Aparentemente, /dev significa diretório de interesse. Mas ./é necessário, não apenas .. A necessidade do /não era óbvia, mesmo depois que eu descobri o que /devsignificava mais ou menos.

Não pude responder como um comentário porque não tenho "reputação".

Athur Snyder
fonte
1
Você ganha reputação dando boas respostas. Por favor, leia este stackoverflow.com/conduct
aifrim
Há razões pelas quais você não tem permissão para comentar e isso não permite que você coloque comentários aqui na seção Resposta. Por favor, apague isso.
Rob