MD5 os arquivos em cada subdiretório dado um diretório inicial, colocando o arquivo de soma de verificação no subdiretório

0

Quais sinalizadores eu preciso dar ao comando find para entrar no diretório antes de executar o comando -exec ?

Eu tenho um diretório cheio de diretórios preenchidos com arquivos

> root directory
 -> directory1
  -> file1
  -> file2...
 -> directory2
  ->file1
  ->file2
 -> directory...

e eu quero colocar um arquivo de soma de verificação em cada diretório que contém as somas do conteúdo do diretório:

> root directory
 -> directory1
  -> file1
  -> file2...
  -> checksums.md5
 -> directory2
  ->file1
  ->file2
  -> checksums.md5
 -> directory...

Eu tenho mexido nas linhas de

find . -type f -name '*' -exec md5sum {} >> checksums.md5 \;

mas coloca o arquivo de soma de verificação no diretório raiz (o ponto de partida), mais o arquivo contém o hash de todos os arquivos. Eu tentei usar o sinalizador -execdir sem uso.

O que eu estou tentando fazer é MD5 o conteúdo de cada pasta e colocar o arquivo de soma de verificação dentro dele, em seguida, passar para a próxima pasta e repetir.

O conteúdo do arquivo checksums.md5 também deve preferencialmente ser classificado.

    
por galeaby 16.07.2018 / 02:55

3 respostas

0

Você precisa fazer o acréscimo por arquivo .

find ... -execdir bash -c 'md5sum "{}" >> checksum.md5' \;
    
por 16.07.2018 / 04:13
0

Eu simplesmente não consegui encontrar sinalizadores apropriados para adicionar ao seu comando find. Então, usei loops e acho que definitivamente existe uma solução melhor do que isso, mesmo usando apenas find

Atravessando para cada diretório

Então, no comando que você escreveu, o arquivo checksum.md5 foi criado no diretório atual (que era root para você). Para criar um arquivo de soma de verificação em cada subdiretório, você precisa atravessar lá, executar o comando e voltar ao diretório atual. Não exatamente, mas algo assim:

cd directory1; md5sum * >> checksum.md5 ; cd ..;

Usando o find no Loop

Então, eu usei apenas linhas que você usou e coloquei em um loop que itera sobre todos os subdiretórios presentes no diretório atual. Aqui está o que eu fiz:

for i in $( ls -d */ );
  do cd $i && find . -type f -name '*' -exec md5sum {} >> checksum_files.md5 \; && cd ..;
  done; 

O que isso faz é:

  • $i contém uma lista de diretórios sobre os quais o loop é iterado.
  • cd $i altera o diretório atual para algum subdiretório da lista.
  • Então find comando que você escreveu já.
  • cd .. Volte para o diretório atual (root, neste caso).
  • Eu usei && entre cd e find para colocar explicitamente a condição de que Se for para o subdiretório somente, execute o comando find.

Uma linha para copiar e colar

for i in $( ls -d */ ); do cd $i && find . -type f -name '*' -exec md5sum {} >> checksum_files.md5 \; && cd ..; done; 

Eu acho que há escopo de melhoria para esta solução e qualquer um desses são bem-vindos. Sinta-se à vontade para adicionar mais detalhes.

    
por 16.07.2018 / 04:23
0

Para construir resposta Ignacio Vazquez-Abrams Eu fiz a seguinte função bash que rastreia os subdiretórios MD5ing o conteúdo, coloca o arquivo MD5 no subdiretório, em seguida, postar processos os arquivos de soma de verificação para classificá-los para que as somas de verificação resultantes são em ordem com base no nome do arquivo:

function md5dirs () {
  find . -type f -name '*' -execdir bash -c 'md5sum "{}" >> checksums.md5' \;
  find . -type f -name 'checksums.md5' -execdir bash -c 'sort -k 2 "{}" -o checksums.md5' \;
}

A alteração do parâmetro -name do primeiro item para incluir extensões com card do estado selvagem, como *.jpg , tornará o comando de localização apenas arquivos específicos do MD5 nos diretórios. Por padrão, com * , ele armazena todos os arquivos em um diretório.

Talvez tornar o parâmetro -name do primeiro local um valor passado seja melhor para algumas pessoas, mas a maioria das pessoas estará processando todo o conteúdo da pasta, em vez de apenas um subconjunto de arquivos.

    
por 16.07.2018 / 17:31