Detectar o tamanho do arquivo e fazer a operação condicionalmente

1

No meu main_dir , tenho muitas subpastas que dizem DFT1 to DFT150 e, em cada diretório, existe um arquivo chamado OSZICAR . No entanto, algumas delas teriam tamanho de arquivo 0.

Então, eu gostaria de ter um script, que entra em cada pasta e verifica o tamanho de OSZICAR , se estiver abaixo do tamanho de 10 bytes, e então exclua sua pasta DFT .

O pseudo-código (que não funciona), eu tenho é:

for f in *; do
 cd $f
 status=(check whether OZICAR has size below 10bytes)
 cd ..
 if (status); do
  rm -r $f
 fi 
done
    
por user40780 01.09.2015 / 09:05

1 resposta

3

Use find :

find DFT*/OSZICAR -size -10c -printf "%h
find DFT*/OSZICAR -size -10c -exec sh -c 'rm -r $(dirname "$1")' sh {} \;
" | xargs -r0 rm -r
  • find procura por todos os arquivos dentro de um diretório DFT* chamado OSZICAR , cujo tamanho de arquivo é menor que 10 bytes; o c significa bytes.
  • Em seguida, find imprime o nome do diretório %h em que o arquivo foi encontrado ( DFT105 , por exemplo), finalizado por um byby% xargs
  • Isso é canalizado para -0 , que lê a linha terminada por um nullbyte rm -r e chama xargs em todos eles.

Eu recomendo chamar o comando sem a parte find , para verificar se tudo funciona corretamente, antes de deletar qualquer coisa.

Editar: Se o seu -printf não aceitar a opção %code% (como o OSX), use isso:

find DFT*/OSZICAR -size -10c -printf "%h
find DFT*/OSZICAR -size -10c -exec sh -c 'rm -r $(dirname "$1")' sh {} \;
" | xargs -r0 rm -r
    
por 01.09.2015 / 09:20