Quando eu uso
find /home/user/parentdir -type d -empty -delete
procura recursivamente por subpastas vazias dentro /home/user/parentdir
e as exclui. Mas se /home/user/parentdir
também estiver vazio, também excluirá a parentdir
pasta, o que é indesejável para mim.
Quero manter isso parentdir
em rsync
alguns arquivos para backup ou nuvem. Após o processamento, preciso excluir as pastas vazias, mas parece improdutivo recriar parentdir
todas as vezes.
Alguma sugestão para manter parentdir
? Pensei em criar um .nocopy
arquivo dentro dele e excluí-lo rsync
, mas parece exagero. Existe uma maneira mais elegante?
command-line
bash
rsync
find
TNT
fonte
fonte
-mindepth 1
?Respostas:
Simplesmente faça
find /home/user/parentdir -mindepth 1 -type d -empty -delete
.Veja:
A
find /home/user/parentdir/*
resposta do AmourK é indesejável quando há muitos arquivos e é complicada demais.fonte
Ao adicionar
/*
no final deparentdir
, você está executando a ação em todos os subdiretórios do parentdir, e não emparentdir
si mesmo. E assim, da mesma forma,/home/user/
não é excluído no comando antigo,parentdir
não será excluído no comando abaixo.*
é chamado de operador glob e corresponde a qualquer sequência de caracteres.find /home/user/parentdir/* -type d -empty -delete
fonte
/home/user/parentdir/
, a glob expandida poderá excederARG_MAX
, resultando em um erro muito longo da lista de argumentos . Você pode reduzir a chance disso acontecer alterando o glob para*/
que ele corresponda apenas aos diretórios./tmp
criação de um subdiretório, a descompactação de um pacote compactado com gzip, a execução do instalador e a limpeza. O novato pensou querm -rf /tmp/foo-install
era o caminho certo para fazer isso, e como a mão experiente dizia "Nããããão" em sua melhor impressão de Darth-Vader no final do Episódio III, o novato descobriu da maneira mais difícil o quão perto / e as teclas Enter estavam entre si. Tivemos que inicializar a partir do disco de restauração do software de backup e recarregar todo o servidor da fita.se você possui o php-cli instalado,
fonte
foreach (RecursiveIteratorIterator(RecursiveDirectoryIterator($dir)) as $p) if (empty($skipped)) $skipped = TRUE; elseif ($p->isDir()) @rmdir($p->getPathname());
ou algo parecido com isso.$skipped
cuida de pular o primeiro,@rmdir
tenta remover um dir e silenciosamente (esse é o @) falha se não estiver vazio.Quando você precisa apenas de um nível (deixando uma pasta pai, mas excluindo pastas filho vazias), um truque fácil é usar
rmdir
.Exclui todas as subpastas vazias, mas imprime apenas um erro para arquivos e pastas não vazias.
Isso não funciona recursivamente, mas ao conhecer a estrutura da pasta, pode ser a maneira mais rápida de fazer algo como
Vantagem: Fácil de lembrar, rápido para digitar, pouco potencial para escolher um parâmetro errado.
Desvantagem: menos flexível, possivelmente várias mensagens de erro no seu terminal.
fonte