find. * -exec ll {} \; - com apenas um resultado em vez de quatro

2

Gostaria de usar o comando find para pesquisar todos os arquivos em um diretório:

find . * -exec ll {} \;

O resultado mostra quatro (!) resultados por arquivo:

  • file123
  • ./test/file123
  • file123
  • test/file123

É possível mostrar apenas o segundo resultado ./test/file123 usando o comando find-out-of-the-box (sem usar coisas como | grep '^\./' )?

Estou usando a versão mais recente do HP / UX.

    
por MyUserName 10.09.2018 / 11:00

3 respostas

5

find . * -exec ll {} \;

Passa . e a lista de arquivos não ocultos no diretório atual (expandida de * pelo shell), incluindo o subdiretório test (e se algum desses arquivos tiver sido iniciado com - ou se houvesse um arquivo chamado ! ou ( , ) ... isso faria com que find reportasse um erro de sintaxe).

Você está dizendo ao find para procurar arquivos recursivamente em . , mas também em test . Portanto, find encontrará test duas vezes e também test/file123 duas vezes.

ll que eu suponho que é um script que faz ls -l é uma ferramenta para listar detalhes de arquivos ou arquivos do tipo diretório, os detalhes de todos os arquivos nesse diretório (a menos que você passe a opção -d ).

Portanto, ll será chamado com ./test e test como argumentos, em que casos se listará os detalhes dos arquivos em seu conteúdo (incluindo test/file ).

E será chamado com ./test/file123 e test/file123 .

Aqui, você deseja:

find . -exec ls -ld {} +

(usar + significa que mais de um arquivo será passado como argumentos para ls , o que é mais eficiente e também permite ls classificar essa lista de arquivos).

Seu find pode até suportar um predicado -ls que se comporta como uma lista de bits ls -lsid :

find . -ls
    
por 10.09.2018 / 11:13
5

Você está obtendo quatro linhas de saída porque você pergunta a find para pesquisar o diretório atual ( . ), bem como tudo o que * expande para.

Para o diretório atual, find continuará a invocar ll nas coisas que encontrar, que serão o diretório atual, o diretório test e o arquivo no diretório test . Isso lista file123 duas vezes.

Em seguida, ele pesquisará tudo em que * se expande, que será o diretório test . Agora ele usará ll on test novamente e no arquivo dentro. Isso lista seu arquivo duas vezes novamente.

Em vez disso, se você estiver procurando por um arquivo normal, use -type f . E você não precisa usar ll (ou ls ) para obter os resultados de find , pois ele listará os nomes dos caminhos encontrados por padrão. Além disso, apenas dê find o diretório atual (ou test ) como o caminho de pesquisa:

find . -type f

Se você souber que está procurando um arquivo com o nome exato file123 :

find . -type f -name 'file123'

Se você quiser uma saída semelhante a ls -l em vez de um nome de caminho:

find . -type f -name 'file123' -ls
    
por 10.09.2018 / 11:10
0

Por favor, note que find irá procurar recursivamente em todos os diretórios.
Find retornará não apenas arquivos, mas também diretórios!

Se você quiser listar todos os arquivos dentro do diretório de teste, tudo o que você precisa é o seguinte comando:% find test/ -type f

Além disso, não sei o que você está tentando alcançar, mas verifique sua find manpage ... Você está usando -exec ll {} \; e suspeito que provavelmente há uma opção find que fará o que você precisa ( filtrar arquivos por tamanho, data de modificação, etc.)

    
por 10.09.2018 / 11:44

Tags