Назад | Перейти на главную страницу

Рекурсивное удаление в Linux с сохранением первого каталога

Первый вопрос здесь. Обычно я использую StackOverflow.

Мне нужно удалить все содержимое каталога, но не сам каталог, поскольку у меня нет разрешения на удаление этого фактического каталога. Это кажется простым, но я не могу найти команду для этого. Заранее спасибо.

rm -r /path/to/directory/*

или

rm -rv /path/to/directory/*

если вы хотите увидеть, что происходит.

Хаос - Вы ошибаетесь, опасаясь, что rm когда-либо удалит ..

Я сделал быстрый поиск и нашел страницы руководства по rm из 7-го издания руководства по unix по адресу http://plan9.bell-labs.com/7thEdMan/vol1/man1.bun где сказано:

ДИАГНОСТИКА

   Generally  self-explanatory.   It  is forbidden to remove the file ..
   merely to avoid the  antisocial  consequences  of  inadvertently  doing
   something like rm -r .

Учитывая, что 7-е издание unix является родительским для всех современных unix и было выпущено в 1979 году, я бы сказал, что это абсолютно безопасный вариант. Он ничего не делает, но и не причиняет никакого вреда.

Есть и другие программы, такие как chown, которые с радостью «спустятся» в ... и вызовут всевозможные хаос, если вы будете делать такие дурацкие вещи, как "chown -Rh user. *", Но rm не chown.

Простая версия, если текущий каталог подходит для работы:

find . ! \( -name . \) -print0 | xargs -0 rm -rf

Более сложная версия, если текущий каталог не подходит:

find /some/dir ! \( -samefile /some/dir \) -print0 | xargs -0 rm -rf

найти / путь / каталог / -тип f -print | xargs rm

Почему не просто:

rm -rf directory

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

Это одна из тех темных областей unix, которые могут быстро стать невыносимыми.

В каждом из приведенных выше примеров есть давняя ошибка в unix, которую в наши дни люди считают просто милой маленькой личностью.

найти . | xargs rm

не будет работать, если в каталоге есть дурацкие имена файлов, такие как новые строки или пробелы. Вы даже можете начать удалять другие файлы не в каталоге, если есть имя файла с; в этом. Кто знает, что произойдет, если в имени файла есть символ `. Просто спросите у маленьких Бобби дроп-столы. Все может быстро стать захватывающим.

Комментарий Билла Вайса правильно указывает на то, что современные версии find и xargs, которые правильно используют нули в качестве разделителей полей для каждой находки, если вы используете -print0 в find и -0 в xargs. Не будучи доверчивым человеком и имея опыт работы со старыми, случайно сломанными версиями unix, я склонен опасаться этих новомодных гнуизмов, хотя они работают достаточно хорошо и в данном случае являются правильным ответом на эту конкретную проблему.

rm -r / path / to / directory / * не будет работать, если у вас в этом каталоге 10 000 файлов.

Теперь - в основном я просто не пытаюсь сделать это правильно, поэтому я использую rm -rf и смотрю на ошибку, если есть ошибка. Если я на 100% уверен, что нет дурацких файлов, я могу использовать find и xargs, хотя я им не очень доверяю.

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

Я действительно не могу придумать быстрый, аккуратный и надежный способ сделать это, но я думаю, что смогу сделать это с помощью сценария оболочки Борна, например:

for a in * .*
do
  rm -rf "$a"
done

Теперь - это безопасно, потому что цикл for защищает командную строку "rm" от миллиарда входных данных, а двойные кавычки вокруг переменной защищают ее от таких дурацких вещей, как escape-символы, точки с запятой или другой мета-мусор. Он также намного медленнее, чем find + xargs.

Так что я думаю, что правильный ответ: «Для этого нет программы. Вы должны написать программу, чтобы сделать это надежно». Думаю, это то, что stallman et all сделали с find и xargs ...

Я считаю, что можно использовать: rm -rf / test / *

Можешь попробовать

# rm -rf [dir]/* [dir]/.*