Рекурсивное удаление 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
Это одна из тех темных областей юникса, которые могут быстро залипать.
Каждый из приведенных выше примеров рассказывает о давней ошибке в 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
Вы получите сообщение об ошибке, так как у вас нет разрешения на удаление каталога. Но это также удалит все в каталоге, включая эти проблемные скрытые файлы.