Как удалить каталоги на основе вывода 'находки'?

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

Недостатки довольно очевидны:

  • если Вы забудете свой пароль, то Вы никогда не будете получать доступ к своим данным
  • необходимо ввести пароль каждый раз, когда Вы входите в систему
  • если у Вас не будет современного Intel CPU с инструкцией AES, то Вы заметите большой хит производительности
  • восстановление поврежденной файловой системы может быть более трудным с шифрованием (два слоя, которые могут быть повреждены вместо одного),
162
03.02.2015, 09:11
7 ответов

Находка может выполнить споры с -exec опция для каждого соответствия это находит. Это - рекомендуемый механизм, потому что можно обработать пути с пробелами/новыми строками и другими символами в них правильно. Необходимо будет удалить содержание каталога, прежде чем можно будет удалить сам каталог, так использование -r с rm команда для достижения этого.

Для Вашего примера можно выйти:

find . -name ".svn" -exec rm -r "{}" \;

Можно также сказать, находят, чтобы просто найти каталоги названными .svn путем добавления a -type d проверка:

find . -name ".svn" -type d -exec rm -r "{}" \;

Предупреждение использования rm -r с осторожностью это удаляет папку и все ее содержание.

Если Вы хотите удалить просто пустые каталоги, а также каталоги, которые содержат только пустые каталоги, находка может сделать это само с -delete и -empty:

find . -name ".svn" -type d -empty -delete
205
27.01.2020, 19:28
  • 1
    я видел совет всегда работать -type после -name в командах находки, начиная с вызовов к stat для получения типа являются дорогими. Я просто попробовал его сам на довольно большом наборе файлов, и это, кажется, верно: выполнение find . -name 'foo' -type d взял 19 secs, в то время как find . -type d -name 'foo' взял 32 secs. Таким образом, приблизительно на 50% более длительное время для выполнения -type сначала. –  spinup 16.03.2015, 18:37
  • 2
    я использовал эту команду в течение многих лет, но на Mac теперь я получаю ошибки, говоря те каталоги, не существует. Даже при том, что это действительно удаляет их. Я никогда не видел сообщения прежде. –  chovy 23.12.2015, 10:51
  • 3
    То же как @chovy. Существует ли способ избавиться от этих сообщений? –  Clément 23.04.2016, 18:32
  • 4
    @chovy @clément, Который является потому что find хочет видеть в той папке для других соответствий, в то время как она удаляет папку одновременно. ~I еще не знают, как зафиксировать это. ~ Грязная фиксация: find . -name "folder-to-delete" -print0 | xargs -r0 -- rm -r –  Charlie 20.07.2016, 15:02
  • 5
    @chovy @Clément, я думаю -depth аргумент фиксирует это: find . -depth -name ".svn" -type d -exec rm -r "{}" \; –  gimboland 27.07.2016, 10:57

Вот является портативное устройство еще быстрее, чем принятый ответ путем.

Используя a + вместо точки с запятой как find разделитель команды оптимизирует использование ЦП. Это может быть значительно, если у Вас есть много из .svn подкаталоги:

find . -name .svn -type d -exec rm -rf {} +

Обратите внимание также, что never1 необходимо заключить фигурные скобки в кавычки здесь.

1, Если Вы не используете fish оболочка.

74
27.01.2020, 19:28
  • 1
    Что такое различие между + и точка с запятой? Почему мы не используем фигурные скобки? –  Shicheng Guo 04.01.2017, 21:25
  • 2
    @ShichengGuo С точкой с запятой, будет одна команда комнаты на найденный каталог, с +, единственная команда комнаты обработает все найденные каталоги (или по крайней мере очень большое количество их.) Я не получаю Ваш второй вопрос, фигурные скобки используются здесь. –  jlliagre 04.01.2017, 22:13
  • 3
    я думаю средства @ShichengGuo, почему мы не должны заключать фигурные скобки в кавычки здесь (@jlliagre записал, что мы никогда не должны заключать им в кавычки). Я не могу найти ссылку теперь, но я понимаю, что это - потому что находка автоматически выйдет из путей, замененных для {}. –  Quinn Comendant 08.03.2017, 08:47
  • 4
    Ответ и вопрос являются не совсем правильными на том, что + делает. Если много файлов найдены затем''; давал бы 'командную строку слишком долго' ошибка. + разделяет файлы, найденные в пакетах, которым меньше, чем макс. позволяют длину командной строки, и выполняет команду для каждого пакета. –  gaoithe 22.03.2017, 13:56
  • 5
    @gaoithe я действительно откатывал Вас редактирование, которое заменило корректный оператор неправильным. Используя + действительно уменьшает использование ЦП, Используя ; не приводит к команде слишком длинную ошибку. –  jlliagre 22.03.2017, 14:26

Bash определенное решение:

shopt -s globstar
rm -r **/.svn
shopt -u globstar #optional. this will disable globstar expansion
5
27.01.2020, 19:28
  • 1
    для расширения командной строки шариков, которые соответствуют многим файлам, существует предел количеству файлов, которым можно соответствовать этому механизму. Осмотр через этот предел приведет к bash: /bin/rm: Argument list too long –  Drav Sloan 09.09.2013, 13:06
  • 2
    @DravSloan корректен, но что предел находится в сотнях тысяч файлов. Это - что-то для мысли, но вероятно не будет проблемой для большинства людей. –  evilsoup 09.09.2013, 13:26

Предположим, вы используете gnu find , вы можете использовать опцию -delete :

find . -name test -delete

, которую легче запомнить.

28
27.01.2020, 19:28

Если вы хотите что-то дерзкое, что просто печатает шестнадцатеричные данные, как они появляются Вы можете использовать сценарий perl:

perl -e '$| = 1; $i = 1;
while(1){
 sysread(STDIN,$ch,1) or exit;
 printf "%02x%s",ord($ch),$i++%16==0?"\n":" ";
}'

И если вы действительно хотите читать до блока и запустить hexdump:

perl -e '$| = 1; $i = 1; $rin = ""; vec($rin, fileno(STDIN), 1) = 1;
open(F,"|hexdump -C") or die;
while(1){
 $nfound = select($rout=$rin, undef, undef, 0);
 if($nfound==1){
  sysread(STDIN,$data,999) or exit;
  syswrite(F,$data) or die;
 }else{
  close(F);
  open(F,"|hexdump -C") or die;
  select($rout=$rin, undef, undef, undef);
 }
}'
-121--100468-

ключи Fluxbox должны поддерживать такое поведение; однако я также заметил некоторые нарушения при попытке сложных действий. Я смог добиться этого, используя следующее:

OnDesktop Mouse1 :If {Matches (Name!=)} {RootMenu} {HideMenus}

Хотя модель сопоставления кажется грубой, она, кажется, работает. У меня не было времени, чтобы выяснить, почему эта работа с Fluxbox, но я просто ожидал, что проверенные свойства (не) установлены, когда меню Fluxbox активно.

Надеюсь, это сработает для вас (или, по крайней мере, для начала). Если вы найдете лучший шаблон состояния для применения, мне было бы любопытно увидеть его.

-121--195353-

На моем компьютере при использовании:

find . \( -name dirname -type d \) -exec rm -r '{}' ';'

Каталоги удалены, но я получаю ошибку

find: ‘./dirname’: No such file or directory

для каждого каталога.

Мои каталоги не пусты, поэтому параметр -delete не будет работать для меня. Я нашел причину такого поведения здесь :

  1. find принимает (не обязательно) первую запись в каталоге ./. например, dir.1/
  2. он сравнивает его с шаблоном "dir.?". он совпадает? да.
  3. Поиск выполняет "rm -r dir.1."
  4. find пытается ввести dir.1/, чтобы найти шаблон в каталоге. он ничего не знает о команде exec.
  5. он больше не находит dir.1/. возвращает ENOENT (посмотрите на вывод строки)

Я использовал это вместо того, чтобы работать вокруг:

rm -r `find . -name dirname -type d`

Имейте в виду, что находка все равно попытается рекурсировать в каталоги с именем dirname, что на самом деле не нужно и займет некоторое дополнительное время. В зависимости от структуры каталога можно обойти эту проблему с помощью опции поиска --depth . Кроме того, если у вас есть структура каталогов, такая как dirname/foo/dirname, вы получите от rm ошибки "Нет таких файлов или каталогов". Для подавления ошибок можно перенаправить stderr на/dev/null или использовать флаг -f (force) с rm.

13
27.01.2020, 19:28

Более быстрый способ сделать это:

find . -name ".svn" -type d -prune -exec rm -rf '{}' '+'

Если у вас есть «.svn» внутри другого «.svn».

12
27.01.2020, 19:28

Я обнаружил, что действие -delete прекрасно работает с тестом -path . Например, с исходной проблемой плакатов должно работать следующее:

find . -path '*/.svn*' -delete
4
27.01.2020, 19:28

Теги

Похожие вопросы