Удалить все пустые папки, даже содержащие папки .svn.

Удалить все пустые папки, даже содержащие папки .svn.

Я пытаюсь удалить все пустые папки в каталоге. Однако find . -type f -emptyничего не находит, потому что каждая папка содержит скрытую .svnпапку.

Как это обойти?

решение1

Если можете, то можете, конечно, сначала удалить все .svnпапки. Недостаток: вы потеряете информацию о контроле версий, если кто-то использует SVN. Если кто-то использует SVN, то не очень хорошая идея просто удалить эти папки (или на самом деле вам придется удалить их из SVN, так как SVN отслеживает папки и файлы).

Если это невозможно, я бы пошел по пути скриптования:

for folder in $(find . -type d); do
 if [ "`ls $folder | wc -l`" -eq 0 ]; then
  echo "I am going to delete $folder"
 fi
done

Сначала попробуйте тестовый запуск, потому что может быть что-то неожиданное. Затем вы можете изменить rm -rвместо этого echo.

Однако следует отметить, что это приведет к удалению всех папок, содержащих только файлы с точкой (например, a/.this_is_super_importantони будут удалены, если нет других файлов или папок).

решение2

Небольшая модификация (просто распечатайте каталог и передайте его xargsпозже):

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

Поместите это где-нибудь в вашем $PATH, например, как svn-emptiesи затем выполните первый запуск:

svn-empties

чтобы составить список найденных каталогов (измените список при необходимости), а затем передать в xargs:

svn-empties | xargs svn rm

Этот скрипт стал очень полезным для меня во время использования git-svn(спасибо!). Поскольку gitон не отслеживает пустые каталоги, я могу получить много пустых каталогов в репозитории Subversion. Я svn coсоздаю отдельную копию репозитория и запускаю ее svn-empties | xargs svn rmпериодически. Использование Subversion изначально не было моим решением ;)

решение3

Я просто наткнулся на это и использовал этот скрипт, но изменил его так, чтобы он правильно учитывал пустые каталоги, только те, в которых есть .svn, и никаких других файлов, скрытых или обычных.

Также имейте в виду, что я использую svn rm, поэтому предполагается, что это будет работать с репозиторием, вы можете адаптировать скрипт так, чтобы он выполнял что-то другое в каталоге.

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

решение4

  1. решена проблема: пробелы в Path
  2. можно вызвать скрипт с параметром PATH следующим образом:

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

Связанный контент