Рекурсивное удаление Linux, сохраняющее первый каталог

Первый вопрос здесь, я обычно на StackOverflow.

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

8 ответов

Решение
rm -r /path/to/directory/*

или же

rm -rv /path/to/directory/*

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

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

Я сделал быстрый поиск и нашел справочные страницы по rm из руководства по Unix 7-го издания на 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 .

Учитывая, что Unix 7-го издания является родителем всех современных 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

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

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

находить. | XARGS RM

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

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

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

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

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

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

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

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

Таким образом, я думаю, правильный ответ: "Для этого нет программы. Вам нужно написать программу, которая будет делать это надежно". Я думаю, это то, что Столлман и все остальные сделали с find и xargs...

Почему бы просто:

rm -rf directory

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

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

Ты можешь попробовать

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

Другие вопросы по тегам