Como encontrar e esvaziar alguns diretórios

3

Gostaria de encontrar e excluir o conteúdo, deixando os próprios diretórios intactos.

Os seguintes

find /data1 -name MyTargetDir -type d -exec rm -rv {} \;

e

find /data1 -name MyTargetDir -type d | xargs -r rm -vfr

exclua todos os arquivos e diretórios em 'MyTargetDir' e 'MyTargetDir' também.

Gostaria de deixar o diretório, mas vazio.

    
por BTA 31.07.2014 / 03:59

5 respostas

1

Recriar o diretório parece ser uma maneira bastante simples de fazer isso.

find /data1 -name MyTargetDir -type d -exec rm -rv {} \; -exec mkdir {} \;

Em vez disso, você poderia usar um subshell no exec para executar um rm -rf * (ou similar) de dentro do diretório. Mas isso parece mais problemático do que o acima. Você tem o efeito colateral de limpar o tamanho do diretório se isso já foi um problema.

Como mencionado, a recriação do diretório pode ser um grande problema. Se assim for, uma alternativa poderia ser:

find /data1 -name MyTargetDir -type d -exec bash "-c" "cd {} && rm -r -- * .*" \;

Isso tem o infeliz problema de reclamar sobre tentativas de remover "." e "..", mas deve ser seguro.

Caso contrário, você pode simplesmente optar por uma solução de script completa, como o perl.

#!/path/to/perl
use strict;
use warnings;
use File::Find;
use File::Path qw/remove_tree/;

my ($dir_to_check, $name_to_remove) = @ARGV;
find(\&wanted, $dir_to_check);
sub wanted {
  if (-d and $_ eq $name_to_remove) {
    remove_tree($_, {keep_root => 1});
  }
}

Passe primeiro no diretório e o nome para corresponder ao segundo. Não é mais um shell one-liner, mas funciona, não destrói o diretório e não cede nenhum aviso falso.

    
por 31.07.2014 / 08:53
0
rm -rf MyTargetDir && mkdir MyTargetDir

Deve fazer o que você está tentando fazer.

    
por 31.07.2014 / 04:06
0

Não há dúvidas de que há maneiras mais legais de fazer isso, mas isso deve funcionar:

for MyTargetDir in 'find /data1 -name MyTargetDir -type d -depth'
do
   if [ $MyTargetDir != "" ]; then
     rm -rfvi $MyTargetDir/*
   fi
done

A instrução if é necessária caso você nunca encontre o diretório que está procurando, caso em que o comando rm destruiria seu sistema de arquivos raiz. Por esse motivo, caso haja um erro no que escrevi, também especifiquei a opção i para que você receba um aviso antes que o comando inicie a remoção de arquivos; Quando estiver satisfeito com o funcionamento pretendido, você poderá remover a opção i .

    
por 31.07.2014 / 04:59
0

Não consigo pensar em uma maneira de expandir o glob em -exec , mas colocá-lo em um subshell deve funcionar.

find /data1 -name MyTargetDir -type d -exec bash -c 'shopt -s dotglob; rm -rv "{}"/*' \;
    
por 04.08.2014 / 09:12
-1

Ou você pode tentar este comando sem a opção r em rm. por isso não será capaz de remover diretórios.

    
por 31.07.2014 / 04:09