Exclui todos os outros diretórios indefinidos

0

Eu preciso criar um script de remoção para remover diretórios externos de uma lista específica de diretórios.

Minha ideia era fazer algo assim:

 #!/bin/ksh find /data/${USER}/SAS/ -type d ! -name 'SE' | find /data/${USER}/SAS/ -type d ! -name 'Rejet' | find /data/${USER}/SAS/ -type d ! -name 'Acq' | find /data/${USER}/SAS/ -type d ! -name 'Archiv' | find /data/${USER}/SAS/ -type d ! -name 'Cloture' | find /data/${USER}/SAS/ -type d ! -name 'Emis' | find /data/${USER}/SAS/ -type d ! -name 'Ident' | find /data/${USER}/SAS/ -type d ! -name 'Irr*' | find /data/${USER}/SAS/ -type d ! -name 'Recep*'

e, em seguida, -type f -exec rm {} \; , mas não sabem como fazer isso.

    
por Fosfor 14.09.2017 / 12:07

2 respostas

0

Para remover todas as pastas no caminho /data/${USER}/SAS/ , exceto as que estão na lista predefinida / especificada, use a seguinte abordagem find otimizada:

find /data/${USER}/SAS/ -type d -regextype posix-egrep \
    ! -regex ".*/(SE|Rejet|Acq|Archiv|Cloture|Emis|Ident|Irr.*|Recep.*)" \
    ! -name "SAS" -exec rm -rf {} \;
    
por 14.09.2017 / 12:43
0

Como você está usando ksh , isso deve ser apenas uma questão:

(FIGNORE='@(.|..)'; cd /data/"$USER"/SAS/ && 
   echo rm -rf -- !(SE|Rejet|Acq|Archiv|Cloture|Emis|Ident|Irr*|Recep*)/)

(remova echo quando estiver satisfeito)

O que removeria todos os diretórios, exceto aqueles que correspondam a essa lista (deixando apenas os arquivos que não são de diretório).

Remova a parte FIGNORE se você não quiser remover diretórios ocultos.

Note que ele também considerará links simbólicos para diretórios (e dependendo da implementação de rm ou excluirá o link simbólico ou o conteúdo do alvo).

Com find , você faria:

cd /data/"$USER"/SAS &&
  find . ! -name . -prune \
    ! -name SE \
    ! -name Reject \
    ! -name Acq \
    ! -name Archiv \
    ! -name Cloture \
    ! -name Emis \
    ! -name Ident \
    ! -name 'Irr*' \
    ! -name 'Recep*' -type d -exec echo rm -rf {} +
    
por 15.09.2017 / 12:36