limpar diretórios múltiplos com rm

1

Estou tentando limpar vários diretórios armazenados em uma matriz. Aqui está um exemplo simplificado (eu tenho mais diretórios).

#!/bin/bash    

$IMAGES_DIR="/Users/michael/scripts/imagefiles"
$BACKUP_DIR="/Users/michael/scripts/imagebackups"

...

array=( $IMAGES_DIR $BACKUP_DIR )
for i in ${array[@]}
do
    if [ "$(ls -A $i)" ]; then     # check that directory has files in it
        rm "$i/"*                  # remove them 
    fi
done

Eu recebo erros para cada diretório, por exemplo:

rm: /Users/michael/scripts/imagefiles/*: No such file or directory

    
por Michael Riordan 24.12.2017 / 03:07

3 respostas

3

Que tal realizar tudo em um único comando?

Você pode capturar a verificação, globbing e remoção de existência de arquivo com uma chamada find . No caso da versão do GNU de find , nós teríamos isto:

for f in "${array[@]}"; do
     find "$f" -type f -delete
done

Se você não tem o GNU find use esta invocação:

find "$f" -type f -exec rm -f {} +

(Se, em vez de limpar arquivos de toda a hierarquia de diretórios, você só quiser limpar os arquivos que são filhos imediatos, adicione -maxdepth 1 antes de -type f .)

Mas espere, tem mais ....

Como John1024 observa sabiamente você pode abrir o loop passando a matriz como o primeiro parâmetro para find :

     find "${array[@]}" -type f -delete

Isso porque: 1) find aceitará que vários diretórios sejam pesquisados e processados em uma execução 2) o shell dividirá o array de tal forma que cada elemento ( diretório) se torna um parâmetro posicional individual para find .

    
por 24.12.2017 / 04:46
1

Altere seu código para isto:

#!/bin/bash    

IMAGES_DIR="/Users/michael/scripts/imagefiles"
BACKUP_DIR="/Users/michael/scripts/imagebackups"

array=( $IMAGES_DIR $BACKUP_DIR )
for i in "${array[@]}"
do
    if [ "$(ls -A "$i")" ]; then     
        rm "${i:?}"/*                 
    fi
done

Erros:

  1. Colocando $ no lado esquerdo das atribuições de variáveis
  2. Não está citando o $i em if [ "$(ls -A $i)" ];then
  3. Use "${var:?}" para garantir isso, rm "$i/"* nunca se expande para /*
por 24.12.2017 / 03:57
-1

Por favor, encontrar o abaixo awel oneliner para alcançar o mesmo, Como testado funcionou bem

i="/root/";ls -ltr /root/| grep "^-rw" | awk -v i="$i" '{print "rm -rvf" " " i$9}' | sh  

por exemplo, eu atribuí a variável i = path / root / você pode alterar conforme sua exigência

i="/ root /" === > caminho

    
por 24.12.2017 / 08:56