Я выполняю следующую команду, чтобы найти каталоги .svn:
find . -name ".svn"
Это дает мне следующие результаты:
./toto/.svn
./toto/titi/.svn
./toto/tata/.svn
Как я могу обработать все эти строки rm -fr
, чтобы удалить каталоги и их содержимое?
find
rm
subversion
Arnaud
источник
источник
-delete
опция.-exec rm -r "{}" \;
в конец находки - будьте осторожны при использованииrm -r
! :)-name ".svn"
он соответствует только.svn
самому каталогу, а не файлам, расположенным в.svn
каталоге.-exec
с кавычками"{}"
).Ответы:
Find может выполнять аргументы с
-exec
опцией для каждого найденного совпадения. Это рекомендуемый механизм, потому что вы можете правильно обрабатывать пути с пробелами / символами новой строки и другими символами. Вам придется удалить содержимое каталога, прежде чем вы сможете удалить сам каталог, поэтому используйте для-r
этогоrm
команду.Для вашего примера вы можете выдать:
Вы также можете указать find только найти каталоги с именем .svn, добавив
-type d
проверку:Предупреждение Используйте
rm -r
с осторожностью, чтобы удалить папку и все ее содержимое.Если вы хотите удалить только пустые каталоги, а также каталоги, которые содержат только пустые каталоги, find может сделать это самостоятельно с помощью
-delete
и-empty
:источник
-type
после-name
того, как в командах найти, так как звонки наstat
получить тип дороги. Я сам попробовал это на довольно большой пачке файлов, и это похоже на правду: работаfind . -name 'foo' -type d
заняла 19 секунд, аfind . -type d -name 'foo'
заняла 32 секунды. Так что на 50% больше времени, чтобы бежать-type
первым.find
хочет видеть в этой папке другие совпадения, одновременно удаляя папку. ~ Я пока не знаю, как это исправить. ~ Грязное исправление:find . -name "folder-to-delete" -print0 | xargs -r0 -- rm -r
-depth
аргумент исправляет это:find . -depth -name ".svn" -type d -exec rm -r "{}" \;
Вот портативный еще быстрее, чем принятый способ ответа.
Использование
+
вместо точки с запятой в качестве разделителяfind
команд оптимизирует использование ЦП. Это может быть важно, если у вас много.svn
подкаталогов:Следует также отметить , что вы никогда не 1 необходимости цитировать фигурные скобки здесь.
1 Если вы не используете
fish
оболочку.источник
+
же снизить нагрузку на процессор, используя;
не приводит к команде слишком долго ошибка.Предположим, вы используете gnu find , вы можете использовать
-delete
опцию:что легче запомнить.
источник
На моем компьютере, когда я использую:
Каталоги удалены, но я получаю ошибку:
для каждого каталога.
Мои каталоги не пусты, поэтому опция -delete для меня не сработает. Я нашел причину такого поведения здесь :
Я использовал это вместо этого, чтобы обойти:
Имейте в виду, что find по-прежнему будет пытаться перейти в каталоги с именем dirname, что на самом деле не является необходимым и займет некоторое дополнительное время. В зависимости от структуры вашего каталога, вы можете обойти это с помощью
--depth
опции поиска. Кроме того, если у вас есть структура каталогов, такая как dirname / foo / dirname, вы получите сообщение об ошибке «Нет такого файла или каталога» от rm. Чтобы подавить ошибки, вы можете перенаправить stderr в / dev / null или использовать-f
флаг (force) с rm.источник
find . -name "to-delete" -print0 | xargs -r0 -- rm -r
это отказоустойчивая версия, которая не падает на пробелах-prune
.-prune
чтобы избежать ошибки «Нет такого файла или каталога».Более быстрый способ сделать это:
Если у вас есть «.svn» внутри другого «.svn».
источник
Bash конкретное решение:
источник
bash: /bin/rm: Argument list too long
Я обнаружил, что
-delete
действие хорошо работает с-path
тестом. Например, следующее должно работать на оригинальной проблеме плакатов:источник
-delete
подразумевает-depth
, и это, безусловно, удаляет непустые каталоги в моей системе.