encontre um arquivo com “find” e mostre o tamanho do arquivo [duplicate]

5

Como posso encontrar um arquivo ao mesmo tempo ver o tamanho do arquivo? ERRO: Eu tentei este comando, mas eu só tenho o tamanho e os detalhes de outros arquivos.

find -name "*.conf" | ls -l
    
por muru 21.05.2018 / 18:42

4 respostas

12

find tem uma opção -ls . Então seu comando deve ficar assim:

find -name '*.conf' -ls
    
por Lienhart Woitok 21.05.2018 / 18:48
7

Uma opção é especificar seu próprio formato com -printf . Por exemplo, isso gerará o tamanho do arquivo seguido por um espaço, em seguida, o nome do arquivo (com caminho relativo):

find -name "*.conf" -printf "%s %p\n"

Você pode terminar sua string de formatação com \n em vez de find se desejar separar os registros de saída do find NUL, no caso de esperar nomes de arquivos engraçados (por exemplo, incluindo newlines).

Para o registro, a tentativa mostrada na sua pergunta não funciona porque você está tentando canalizar a saída de ls para a entrada para ls . find não lê nenhuma entrada de STDIN, portanto, a saída de ls é simplesmente descartada e, em seguida, %code% lista o conteúdo do diretório atual, como de costume.

    
por Digital Trauma 21.05.2018 / 21:05
4

Outras respostas já apontaram

  1. como imprimir o tamanho do arquivo com find , usando -printf
  2. como obter uma saída ls com find apenas, usando -ls
  3. como canalizar adequadamente a saída de find para outro programa com xargs

No entanto, a primeira e a segunda abordagem não fornecem a saída exata de ls -l (a -ls é igual a ls -dils ) e a terceira precisa de uma chamada xargs adicional. Com a ajuda do -exec , é possível chamar ls -l diretamente de find :

find -name "*.conf" -exec ls -l {} +

Isso fornece toda a lista de nomes de arquivos como argumentos para ls -l e o chama quantas vezes forem necessárias.

Se você quiser apenas corresponder a todos os arquivos terminados em .conf dentro e abaixo do diretório atual (e ARG_MAX não é um problema!), você realmente não precisa de find . Em vez disso, você pode usar a correspondência de glob bash com as opções globstar e dotglob shell da seguinte maneira - é igualmente sábio o suficiente não quebrar em novas linhas em nomes de arquivos e corresponder a arquivos "ocultos" como find :

$ shopt -s globstar dotglob
$ ls -l **/*.conf
    
por dessert 22.05.2018 / 11:31
3

ls não obtém sua lista de arquivos da entrada padrão, espera que sejam argumentos. O comando xargs é um recurso geral para transformar entrada em argumentos:

find -name '*.conf' | xargs ls -l

No entanto, isso dividirá a entrada no espaço em branco, para que você possa ter problemas se algum dos nomes tiver espaços. find e xargs têm opções que funcionam juntas para atenuar isso:

find -name '*.conf' -print0 | xargs -0 ls -l

A opção -0 para xargs diz para usar um byte nulo como o delimitador entre os parâmetros na entrada, e -print0 indica find para imprimir os nomes separados por um byte nulo ao invés de nova linha. / p>     

por Barmar 22.05.2018 / 02:36