Eu preciso excluir todas as pastas dentro de uma pasta usando um script diário. A pasta para esse dia precisa ser deixada.
A pasta 'myfolder' possui 3 subpastas: 'test1', 'test2' e 'test3' Preciso excluir tudo, exceto 'test2'.
Estou tentando combinar o nome exato aqui:
find /home/myfolder -type d ! -name 'test2' | xargs rm -rf
OU
find /home/myfolder -type d ! -name 'test2' -delete
Este comando sempre tenta excluir a pasta principal 'myfolder' também! Há alguma maneira de evitar isto ?
!
operador:\!
ou'!'
.Respostas:
Isso excluirá todas as pastas internas,
./myfolder
exceto que./myfolder/test2
e todo o seu conteúdo será preservado:Como funciona
find
inicia um comando find../myfolder
diz ao find para começar com o diretório./myfolder
e seu conteúdo.-mindepth 1
para não corresponder a./myfolder
si próprio, apenas os arquivos e diretórios abaixo dele.! -regex '^./myfolder/test2\(/.*\)?'
diz ao find para excluir (!
) qualquer arquivo ou diretório que corresponda à expressão regular^./myfolder/test2\(/.*\)?
.^
corresponde ao início do nome do caminho. A expressão(/.*\)?
corresponde (a) a uma barra seguida por qualquer coisa ou (b) nada.-delete
diz ao find para excluir os arquivos correspondentes (ou seja, não excluídos).Exemplo
Considere uma estrutura de diretório que se parece;
Podemos executar o comando find (sem
-delete
) para ver o que ele corresponde:Podemos verificar se isso funcionou olhando os arquivos que permanecem:
fonte
-prune
deixartest2/*/
subdiretórios em paz: retornerm -r
e adicione-maxdepth 1
../myfolder
. Você precisa de um (IMvhO) ausente apenas-type d
para diretórios .find ./myfolder -depth -mindepth 1 -maxdepth 1 -type d ! -regex '^./myfolder/test2\(/.*\)?'
Usando o bash :
Exemplo:
fonte
tl; dr
Remova o eco se estiver satisfeito com a lista de arquivos.
O uso
-mindepth 1
garantirá que o diretório superior não esteja selecionado.Mas
-not -name test2
será não evitar subdirs dentrotest2
:Para fazer isso, você precisa de algo como a ameixa:
Mas não use
delete
, como implicadepth
e isso começará a ser apagado do caminho mais longo:Ou use
rm -rf
(remova oecho
se você deseja realmente apagar):Ou use também
maxdepth
se tudo o que você precisa é excluir diretórios (e tudo o que estiver dentro) (remova oecho
para realmente apagar):A
-delete
ainda falhará se o diretório não estiver vazio:fonte
Se você estiver usando o zsh, poderá:
fonte
Testado com o comando abaixo e funcionou bem
fonte
-mindepth 1
) faz com que o diretório superior corresponda a todos os critérios (é um diretório e não é chamado "test2") e, portanto, é excluído.