Como excluir um arquivo específico do hash através do script bash

3

Na verdade, eu tento executar recursiva através de uma estrutura de pastas e fazer o md5sum em todos os arquivos em um único arquivo md5checksums.

Aqui está meu script:

#!/bin/bash
rm -f md5checksums
find -type f -exec md5sum "{}" + > md5checksums

Meu problema agora é que o arquivo md5checksums também está rodando através do md5sum e eu não consigo entender como evitar isso. Além disso, o script já faz o que deve fazer. Alguém que possa me ajudar?

    
por Videonauth 10.04.2016 / 21:59

5 respostas

3

faça o script receber o nome do arquivo específico que você deseja excluir como argumento.

#!/bin/bash
rm -f md5checksums
find -type f ! -iname "" -exec md5sum "{}" + > md5checksums

chame o script com ./script "md5checksums"

    
por user257256 10.04.2016 / 22:20
2

A maneira mais simples de evitar conflitos envolvendo redirecionamentos para um arquivo que afeta o comando seria usar sponge de moreutils:

sponge  reads  standard  input and writes it out to the specified file.
Unlike a shell redirect, sponge soaks up all its input  before  opening
the  output file. This allows constructing pipelines that read from and
write to the same file.

O efeito é que o arquivo, se não estiver presente, não é criado até que o pipeline seja concluído. Então:

find . -type f -exec md5sum {} + | sponge md5checksums
    
por muru 10.04.2016 / 22:34
2

Usando apenas bash :

Usando GLOBIGNORE :

$ GLOBIGNORE='md5checksums'  ## Pattern to ignore
$ shopt -s globstar  ## Recursive globbing
$ { for i in **/*; do [ -f "$i" ] && md5sum "$i"; done ;} >md5checksums

Usando extglob :

$ shopt -s extglob ## Enables extended pattern matching, enabled by default
$ shopt -s globstar
$ { for i in **/!(md5checksums); do [ -f "$i" ] && md5sum "$i"; done ;} >md5checksums

Usando zsh :

% setopt extended_glob 
% { for i in **/^md5checksums(.); do md5sum "$i"; done  ;} >md5checksums
  • zsh faz correspondência recusiva por padrão ao usar **

  • ^md5checksums é zsh extended glob pattern, ou seja, corresponde a todo o restante, exceto md5checksums

  • O qualificador de glob (.) restringe correspondências apenas a arquivos regulares.

por heemayl 11.04.2016 / 03:57
1

Outro que faz o que você quer:

#!/bin/bash
rm -f md5checksums
find -type f -not -name "md5checksums" -exec md5sum "{}" + > md5checksums
    
por cmks 10.04.2016 / 22:25
1

Obrigado a @heemayl por uma boa inspiração em sua resposta.

#!/bin/bash

shopt -s globstar

rm -f md5checksums

for i in **/*; do
    if [ ! -f "$i" -o "$i" = md5checksums -o "$i" = this_script.sh ]; then
        continue
    else
        md5sum "$i" >> md5checksums
    fi
done
    
por jbrock 14.04.2016 / 16:49