
Estou tentando excluir todas as pastas vazias de um diretório. Porém, find . -type f -empty
não encontra nada porque cada pasta contém uma .svn
pasta oculta.
Como posso contornar isso?
Responder1
Se puder, é claro que você pode primeiro remover todas .svn
as pastas. Desvantagem: você perderá informações de controle de versão se alguém estiver usando SVN. Se alguém estiver usando o SVN, não é uma boa ideia apenas remover essas pastas (ou, na verdade, você também terá que removê-las do SVN, pois o SVN está rastreando pastas e arquivos).
Se isso não for possível, eu usaria a rota de script:
for folder in $(find . -type d); do
if [ "`ls $folder | wc -l`" -eq 0 ]; then
echo "I am going to delete $folder"
fi
done
Primeiro tente executar o teste, porque pode haver algo surpreendente. Então você pode mudar rm -r
em vez disso echo
.
Observe, no entanto, que isso removerá todas as pastas apenas com arquivos de ponto (por exemplo a/.this_is_super_important
, serão excluídas se não houver outros arquivos ou pastas).
Responder2
Pequena modificação (basta imprimir o diretório e canalizá-lo xargs
mais tarde):
for folder in $(find -type d ! -path *.svn*); do
if [ "`find $folder ! -path *.svn* ! -path $folder | wc -l`" -eq 0 ]; then
echo $folder
fi
done
Coloque isso em algum lugar do seu $PATH
, talvez como svn-empties
e execute primeiro:
svn-empties
para listar quais diretórios foram encontrados (modificar a lista, se necessário) e, em seguida, canalizar para xargs
:
svn-empties | xargs svn rm
Este script se tornou muito útil para mim durante o uso git-svn
(obrigado!). Como git
não rastreia diretórios vazios, posso acabar com muitos diretórios vazios no repositório do Subversion. Eu svn co
faço uma cópia separada do repositório e executo svn-empties | xargs svn rm
periodicamente. Usar o Subversion em primeiro lugar não foi minha decisão;)
Responder3
Acabei de descobrir isso e usei esse script, mas modifiquei-o para considerar corretamente os diretórios vazios apenas aqueles com .svn e nenhum outro arquivo, oculto ou normal.
Além disso, tenha em mente que estou usando svn rm, então isso deve funcionar em um repositório, você pode adaptar o script para fazer algo diferente no diretório.
for folder in $(find -type d ! -path *.svn*); do
if [ "`find $folder ! -path *.svn* ! -path $folder | wc -l`" -eq 0 ]; then
svn rm $folder
fi
done
Responder4
- resolveu o problema que: espaços no caminho
- pode chamar o script com o parâmetro PATH assim:
svn-empties YOU_WANT_TO_SEARCH_PATH
C_IFS=$IFS
IFS=$'\n'
for folder in $(find "$1" -depth -type d ! -path *.svn*|sort -r); do
counts=$(find "$folder" -type f ! -path *.svn* ! -path $folder | wc -l)
if [ $counts -eq 0 ]; then
echo $folder
fi
done
IFS=$C_IFS