Этот вопрос является своего рода этапом II к первому вопросу, который я разместил здесь
У меня есть каталог, который содержит множество подкаталогов, ZIP-файлы и другие случайные файлы, не содержащиеся в подкаталоге.
Мне бы хотелось, чтобы скрипт командной строки удалял все подкаталоги из родительского каталога, но оставлял все zip-файлы и свободные файлы, которые не принадлежат никаким подкаталогам. Все подкаталоги имеют контент, поэтому я считаю, что мне нужно принудительно удалить их с помощью команды -f.
Таким образом, в основном, команда, которая ищет внутри родительского каталога (или текущего каталога), удаляет из него все папки, но сохраняет все остальное содержимое и файлы, которые не являются папкой или содержатся в папке.
Я понимаю, что удаление элементов из командной строки требует особой осторожности, но я уже принял все необходимые меры предосторожности для резервного копирования удаленно.
-r
,-R
,--recursive
Являются синонимами означает «удалить каталоги и их содержимое рекурсивно».rm -R ./*/
- это также позволяет избежать проблем с именами дефисов.В дополнение к подстановочному способу вы также можете использовать
find
(по крайней мере, GNU find) для этого:Как и в случае с другими
find
строками, вы можете запустить first part (find -mindepth 1 -maxdepth 1 -type d
), чтобы увидеть список каталогов, которые будут удалены.Более безопасный вариант - сделать что-то вроде этого:
любой из которых переместит весь материал
../to-rm
вместо того, чтобы удалить его. Вы можете проверить, что он сделал то, что вы хотели, имrm -Rf
этот каталог на досуге.источник
to-rm
иfind
который хорошо обрабатывает каталоги , начинающиеся с точки (в дополнение к любым другим громоздких отводящей). :)Возможно, вы захотите создать сценарий для некоторых из этих предложений, особенно
rm -R -- */
, и сохранить его в папке / usr / local / bin; или создайтеalias
файл ~ / .bashrc. Так как это так легко опечатка команды и сломать систему - хотя бы одну буквы и / или порядка букв могут привести к катастрофическим последствиям - это служил бы несколько более надежным решением , чем того , чтобы вводить различные опции и аргументы каждый раз, когда вы хотите выполнить эту задачу.Кроме того, вы можете захотеть включить опцию
-i or --interactive=once
или-I or --interactive=always
в ваш скрипт / команду, которая будет служить другим инструментом, чтобы избежать непреднамеренного удаления.Кроме того, что-то вроде Дероберта было бы лучше; просто скопируйте / вставьте скрипт в файл / терминал-редактор и настройте его в соответствии с вашими потребностями, и файлы / каталоги будут перемещены в один каталог (содержимое которого вы можете проверить / проверить), который вы можете просто удалить с помощью выдача
rm -rf
команды.Другой вариант - использовать GUI-приложение, такое как ваш файловый менеджер, и просто выбрать все соответствующие файлы / папки, которые вы хотите удалить. Проверьте справочные страницы вашего дистрибутива, если у вас нет прав.
Наконец, если папки пусты - по существу, простые имена файлов - вы можете использовать
rmdir
команду для их удаления. Это не работает для всего, что вы, возможно, захотите удалить, но пригодится в те моменты, когда вы захотите провести «уборку дома». ** Вы можете попробовать-p --ignore-fail-on-non-empty
опцию, которая позволит вам удалить определенные подкаталоги, а также их пустые «родители» - каталоги, в которых они находятся.источник
Сначала вам нужно вывести список каталогов, а затем удалить их, не мешая обычным файлам, ls -d * /, перечисляет только подкаталоги, а передача его с помощью rm удаляет каталоги и их содержимое, сохраняя свободные файлы нетронутыми.
Эта команда должна сделать работу,
источник
rm -rf -- */
?printf '%s\0' */ | xargs -r0 rm -rf --
поможет (в оболочках, гдеprintf
встроен, а неls
), чтобы обойти список arg слишком большие ошибки, ноls -d */ | xargs rm -rf
не добавляет ничего AFAICT, кроме дополнительных проблем." .."
(пробел..
), он удалил бы содержимое родительского каталога с некоторымиls
реализациями. И это не только пробелы, но и другие пустые символы, новая строка, одинарные кавычки, двойные кавычки, обратная косая черта и имена файлов, начинающиеся с-
.printf
для создания списка, в котором каждое имя заканчивается нулевым символом, чтобы его можно было обработать сxargs
помощью этой-0
опции, я бы посоветовал вам отредактировать свой ответ, чтобы обновить его с его вариацией. Я был бы совершенно уверен, что он был бы рад, если бы вы использовали его фрагмент кода, если вы понимаете его и узнали, как он защищает от нежелательного поведения, вызванного определенными именами файлов, которые могут потенциально существовать.xargs
имеет одно преимущество перед принятым ответом (оно работает, когда в текущем каталоге очень большое количество файлов / каталогов), поэтому есть возможность отредактировать его до полезного ответа. Лично я считаю, что ответы на вопросы по Stack Exchange являются хорошим опытом обучения, особенно когда я получаю полезную обратную связь от других пользователей.rm -rf <directory name>
, Оно работает. Просто ввод текстаrm <directory name>
приводит к количеству подвопросов, в которых каждый из подкаталогов должен быть удален вручную. Ноrm -rf
помогает в удалении всего каталога вместе с его подкаталогами.источник