Exclua todas as pastas vazias, mesmo que contenham pastas .svn

Exclua todas as pastas vazias, mesmo que contenham pastas .svn

Estou tentando excluir todas as pastas vazias de um diretório. Porém, find . -type f -emptynão encontra nada porque cada pasta contém uma .svnpasta oculta.

Como posso contornar isso?

Responder1

Se puder, é claro que você pode primeiro remover todas .svnas 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 -rem 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 xargsmais 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-emptiese 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 gitnão rastreia diretórios vazios, posso acabar com muitos diretórios vazios no repositório do Subversion. Eu svn cofaço uma cópia separada do repositório e executo svn-empties | xargs svn rmperiodicamente. 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

  1. resolveu o problema que: espaços no caminho
  2. 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

informação relacionada