Você precisa fazer o acréscimo por arquivo .
find ... -execdir bash -c 'md5sum "{}" >> checksum.md5' \;
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.
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
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 ..;
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. find
comando que você escreveu já. cd ..
Volte para o diretório atual (root, neste caso). &&
entre cd
e find
para colocar explicitamente a condição de que Se for para o subdiretório somente, execute o comando find. 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.
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.
Tags command-line bash linux