O main_directory inclui 0001 0102 0203 ... subdiretórios. Os subdiretórios incluem muitos diretórios. Preciso excluir todos os subdiretórios, exceto vários cujos nomes são "abc", "bcd" e "123", por exemplo.
Como pode fazer esse processamento de exclusão usando o comando?
Rápido e sujo, mas muito eficiente:
Em câmera lenta:
extglob
permite padrões estendidos de bash (incluindo tings como!(abc|def)
isso significa (qualquer coisa menosabc
oudef
)globstar
faz**
corresponder a qualquer nível de diretórios./**/!(abc|def)
irá corresponder a tudo que não for chamadoabc
oudef
(estou assumindo que você já removeu os arquivos, caso contrário, com um padrão ligeiramente diferente, vocêrm
também pode remover os arquivos [*] )rmdir
níveis superiores virão antes que os níveis inferiores sejam removidos, e é por isso que você pode ter que repetir o comando algumas vezes.Mais clássico com
find
Você também pode usar
find
(com-depth
para processar os subdiretórios primeiro):mas, como você vê, o comando será bastante detalhado se você tiver mais do que alguns diretórios para ignorar.
[*]
rm ./**/!(abc|def)/*.txt
por exemploAcho que sua melhor opção é usar
find
Acredito que este comando fará o que você deseja.
Mas sugiro executá-lo sem o
-delete
ou otype f -delete
primeiro para que você possa ver o que está sendo removido. Ou até mesmo executá-lo em um conjunto de diretórios de teste para garantir que ele esteja fazendo o que você pensa antes de executá-lo em seus arquivos importantes.Para obter mais informações sobre este e outros métodos sobre como fazer isso,
find
consulte a seguinte pergunta https://unix.stackexchange.com/questions/87258/delete-all-files-except-in-a-certain-subdirectory-with- acharEditar:
Para esclarecer alguma confusão sobre o uso de
-type f
em vez de-type d
, se você tentar, verá que ele realmente faz o que o OP está pedindo. Na-type d
verdade, o sinalizador resulta na ordem dos arquivos e diretórios listados em uma ordem diferente. Como tal,delete
tenta remover o diretório antes que o arquivo no diretório tenha sido removido (o que não é permitido fazer). Portanto, para usar o-type d
sinalizador, a ordem dos arquivos listados teria que ser invertida, o que é possível, mas também parecia uma etapa desnecessária, pois otype -f
sinalizador realmente funciona excluindo arquivos e diretórios.