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 usark
eG
sufixos, se necessário, leia mais sobre suas possibilidades emman find
, se necessário) -
-type f
evita listar diretórios - você não pode contarmd5sum
para um diretório -
-print0
criafind
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
if0
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.