Liste arquivos maiores que o tamanho especificado, então crie md5sum ou sha256sum deles

6

Gostaria de saber como criar uma lista com o md5sums a partir de arquivos no diretório atual - arquivos que estão acima do tamanho especificado. Eu posso fazer um ou outro, mas não sei como combinar os dois.

    
por Bug J. 23.06.2017 / 02:10

1 resposta

8

Você pode enviar a saída find (que listará todos os arquivos de seu interesse) para md5sum .

xargs é necessário para evitar a criação de um loop.

Para escrevê-lo em um comando:

find . -maxdepth 1 -size +30M -type f -print0 | xargs -0 md5sum

  • . diz "iniciar listando itens do diretório atual"
  • -maxdepth 1 especifica listar apenas arquivos neste diretório (não descer mais)
  • -size +30M especifica listar apenas arquivos que excedam 30 megabytes de espaço (você também pode usar k e G sufixos, se necessário, leia mais sobre suas possibilidades em man find , se necessário)
  • -type f evita listar diretórios - você não pode contar md5sum para um diretório
  • -print0 cria find nomes de arquivos separados com o byte nulo. Usamos isso porque tudo falha quando você coloca uma nova linha no nome do arquivo.

xargs vai pegar o material da entrada padrão (graças ao -0 flag ele tratará o byte nulo como separador de registro) e os alimentará como argumentos para md5sum .

Você também pode fazer isso sem o pipe, mas eu acho essa sintaxe confusa e eu prefiro canalizá-la para xargs : find . -maxdepth 1 -size +30M -type f -execdir md5sum {} \;

E, como @David escreve nos comentários, você pode colocar + após o {} , ou seja, find . -maxdepth 1 -size +30M -type f -execdir md5sum {} + \; .

O que isso muda? md5sum pode ser chamado para dois arquivos de duas maneiras: md5sum file1; md5sum file2 ou md5sum file1 file2 . Sem o + você obtém a primeira opção, adicionar + resulta em executá-lo da segunda maneira. O benefício mais importante é a velocidade, pois md5sum é executado apenas uma vez. Pode não ser que benéfico para alguns programas, mas, em alguns casos, por exemplo, um programa pode ser executado em vários núcleos e acelerar o trabalho pelo fator de NUM_CPUS.

Sobre essa estranha sintaxe (de man find ):

-execdir command ;

Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of ';' is encountered. The string '{}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a '\') or quoted to protect them from expansion by the shell. See the EXAMPLES section for examples of the use of the -execdir option. The specified command is run once for each matched file.

    
por 23.06.2017 / 02:20