Preciso calcular uma soma de verificação md5 resumida para todos os arquivos de um tipo específico ( *.py
por exemplo) colocados em um diretório e em todos os subdiretórios.
Qual o melhor jeito pra fazer isso?
Edit: As soluções propostas são muito boas, mas isso não é exatamente o que eu preciso. Estou procurando uma solução para obter uma única soma de verificação de resumo que identifique exclusivamente o diretório como um todo - incluindo o conteúdo de todos os seus subdiretórios.
Respostas:
O comando find lista todos os arquivos que terminam em .py. O md5sum é calculado para cada arquivo .py. O awk é usado para selecionar os md5sums (ignorando os nomes dos arquivos, que podem não ser únicos). Os md5sums são classificados. O md5sum dessa lista classificada é retornado.
Eu testei isso copiando um diretório de teste:
Renomeei alguns dos arquivos em ~ / pybin2.
O
find...md5sum
comando retorna a mesma saída para os dois diretórios.fonte
awk ...
peça se considerar a parte de layout da assinatura.Crie um arquivo tar em tempo real e faça o pipe para
md5sum
:Isso produz um único md5sum que deve ser exclusivo para a sua configuração de arquivo e subdiretório. Nenhum arquivo é criado no disco.
fonte
ls -alR dir | md5sum
. Isso é ainda melhor sem compactação apenas uma leitura. Ele é único porque o conteúdo contém o tempo eo tamanho do arquivo mod;)z
para gzip ouj
bzip2. Eu também não fiz.tar
o mesmo conjunto de arquivos duas vezes ou em dois computadores diferentes produza o mesmo resultado exato.A sugestão de ire_and_curses de usar
tar c <dir>
tem alguns problemas:rsync -a --delete
faz: sincroniza praticamente tudo (menos xattrs e acls), mas sincroniza o proprietário e o grupo com base em seu ID, não na representação de cadeias. Portanto, se você sincronizou com um sistema diferente que não necessariamente tem os mesmos usuários / grupos, adicione o--numeric-owner
sinalizador ao tarEnquanto não houver solução para o primeiro problema (ou a menos que você tenha certeza de que isso não o afeta), eu não usaria essa abordagem.
As
find
soluções baseadas propostas acima também não são boas, pois incluem apenas arquivos, não diretórios, o que se torna um problema se você usar a soma de verificação em diretórios vazios.Por fim, a maioria das soluções sugeridas não é classificada de maneira consistente, pois o agrupamento pode ser diferente entre os sistemas.
Esta é a solução que eu vim com:
Notas sobre esta solução:
LC_ALL=C
objetivo é garantir uma ordem de classificação confiável entre os sistemas-print0
sinalizador,find
mas, como há outras coisas acontecendo aqui, só consigo ver soluções que tornariam o comando mais complicado do que vale a pena.PS: um dos meus sistemas usa um busybox limitado
find
que não suporta-exec
nem-print0
sinalizadores, e também adiciona '/' para indicar diretórios, enquanto o findutils find não parece, então, para esta máquina, preciso executar:Felizmente, não tenho arquivos / diretórios com novas linhas em seus nomes, portanto isso não é um problema nesse sistema.
fonte
Se você se importa apenas com arquivos e não com diretórios vazios, isso funciona muito bem:
fonte
Por uma questão de completude, há md5deep (1) ; não é diretamente aplicável devido ao requisito de filtro * .py, mas deve funcionar bem com find (1).
fonte
Uma solução que funcionou melhor para mim:
Razão pela qual funcionou melhor para mim:
Problemas com outras respostas:
Os metadados do sistema de arquivos não são ignorados para:
tar c - "$path" | md5sum
Não manipula nomes de arquivos que contenham espaços nem detecta se o arquivo foi renomeado:
fonte
Se você quiser um md5sum abrangendo todo o diretório, eu faria algo como
fonte
cat **.py
| md5sumSoma de verificação todos os arquivos, incluindo o conteúdo e seus nomes de arquivo
O mesmo que acima, mas incluindo apenas arquivos * .py
Você também pode seguir links simbólicos, se quiser
Outras opções que você pode considerar usar com grep
fonte
Localização GNU
fonte
Tecnicamente, você só precisa executar
ls -lR *.py | md5sum
. A menos que você esteja preocupado com alguém modificando os arquivos e retornando-os às datas originais e nunca alterando o tamanho dos arquivos, a saída dels
deve informar se o arquivo foi alterado. Meu unix-foo é fraco, então você pode precisar de mais alguns parâmetros de linha de comando para obter o tempo de criação e o tempo de modificação para impressão.ls
também informará se as permissões dos arquivos foram alteradas (e tenho certeza de que existem opções para desativá-lo, se você não se importar com isso).fonte
touch
um arquivo alterar sua data (mas não seu conteúdo), esperaria que a soma de verificação permanecesse inalterada.Usando
md5deep
:md5deep -r FOLDER | awk '{print $1}' | sort | md5sum
fonte
Eu tive o mesmo problema, então criei este script que apenas lista os md5sums dos arquivos no diretório e, se encontrar um subdiretório, será executado novamente a partir daí, para que isso aconteça, o script deve ser capaz de executar os procedimentos atuais. diretório ou de um subdiretório se o argumento for passado em $ 1
fonte
Se você quer realmente independência dos atributos do sistema de arquivos e das diferenças no nível de bit de algumas versões tar, você pode usar o cpio:
fonte
Existem mais duas soluções:
Crio:
Verifica:
fonte
md5sum
funcionou bem para mim, mas tive problemas com asort
classificação de nomes de arquivos. Então, em vez disso, classifiquei pormd5sum
resultado. Eu também precisava excluir alguns arquivos para criar resultados comparáveis.find . -type f -print0 \ | xargs -r0 md5sum \ | grep -v ".env" \ | grep -v "vendor/autoload.php" \ | grep -v "vendor/composer/" \ | sort -d \ | md5sum
fonte