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"
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?
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"
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
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.
Outro que faz o que você quer:
#!/bin/bash
rm -f md5checksums
find -type f -not -name "md5checksums" -exec md5sum "{}" + > md5checksums
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
Tags command-line bash scripts