
Я пытаюсь удалить все пустые папки в каталоге. Однако 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
- решена проблема: пробелы в Path
- можно вызвать скрипт с параметром 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