Quero remover os diretórios B e D. Mas quero manter C e todos os seus arquivos e diretórios descendentes. Qual é o comando para remover todos os diretórios filhos de um diretório pai, exceto um diretório e seus filhos.
Ajuda apreciada.
filesystem
directory
directory-structure
Joe Saad
fonte
fonte
A
no seu exemplo)? Excluí-los também ou mantê-los?Respostas:
O que você quer é este comando:
Demo:
Explicação:
find DIRECTORY
chamar o comando find para operar no DIRECTORY-mindepth 1
: trabalhe apenas com o conteúdo do diretório, evite o próprio diretório, que é o nível 0-maxdepth 1
: impede a descida em subdiretórios (rm -rf
é recursivo de qualquer maneira, portanto, não precisamos descer em subdiretórios para removê-los)-type d
: procure apenas diretórios-not \( -name "keepMe" \)
ignore o item com o nome que você deseja manter-exec rm -rf {} \;
execute a remoção em cada item encontradofonte
find
é um bom amigo aqui, mas Bash éfor
etest
é melhor amigo ...>: - DUsando os recursos glob estendidos do bash shell (que são ativados por padrão nas instalações atuais do Ubuntu),
você pode resolver tudo que estiver excluindo
C
e seu conteúdo usando a expressão glob,A/!(C)
ou seja,Então, para remover tudo, exceto o diretório
C
e seu conteúdo, você pode simplesmente usarsaindo
fonte
('"
quando eu executá-lo remotamente viassh $VM_ADDRESS "rm -rf $APP_FOLDER/!(node_modules)"
Todas as ideias Thanks a lot.?.extglob
opção shell só é habilitado para shells interativos - não tenho certeza se você pode forçarssh
a fazer issoUma maneira fácil seria usar o lixo-cli
você pode instalá-lo com
sudo apt-get install trash-cli
uma vez instalado, você pode navegar para o diretório-pai A
cd /A
e emitir o comando emtrash B D
que B e D são os diretórios que você deseja remover (eles acabarão na lixeira da unidade em que estão), se você cometer um erro, poderá recuperar os arquivos)Testado no Ubuntu 16.04 e 14.04
fonte
trash ! C
?trash: cannot trash non existent
! ''extglob
.Simplesmente use o
for
loop do Bash etest
para filtrar os diretórios desejados e orm -rf
comando para excluir diretórios recursivamente, desta forma:Isso itera sobre todos os elementos (arquivos e diretórios) dentro
/path/to/parent/
e exclui o elemento recursivamente se seu nome não for igual adir_survive
. Se o diretório pai for o diretório atual, você poderá escrever apenas*
como caminho.Se você não tiver certeza e quiser testar quais elementos serão excluídos primeiro sem executar nenhuma ação, basta substituir
rm -rf
o comando acima porecho
e ele produzirá apenas os candidatos a exclusão.Aqui está um exemplo de execução:
fonte