Как удалить все файлы и подкаталоги в каталоге, НЕ удаляя каталог в bash?

Есть ли команда для удаления всех файлов и подкаталогов в каталоге без удаление каталога?

Например, если у меня есть каталог dontDeleteMe с подкаталогами 1, 2, 3 и в каждом подкаталоге есть несколько картинок, как я могу удалить подкаталоги 1, 2, и 3 и все файлы в них, не удаляя родительский каталог dontDeleteMe?

Чтобы удалить все в каталог, не удаляя каталог, введите:

rm -rfv dontDeleteMe/*

Пожалуйста, обратите внимание, что /* часть очень важна. Если вы поставите пробел перед *, он удалит все ваши файлы в вашем текущем каталоге.

Кроме того, будьте очень осторожны, играя с rm, -r и * все в одной команде. Они могут быть катастрофическим сочетанием.

Обновление: Хорошо, я понял, что если у вас есть скрытые файлы / dot [имена файлов с точками в начале, например.x. .hidden] тогда это оставит эти файлы нетронутыми.

Так что на самом деле, самое простое решение для оригинальный вопрос является:

rm -rfv dontDeleteMe && mkdir dontDeleteMe

Другим вариантом было бы использовать find-exec вариант или труба для xargs (ниже):

find dontDeleteMe/* -print0  | xargs -0  rm -rv

Единственная причина rm -r ./* не всегда работает, потому что у вас могут быть скрытые файлы и / или папки, которые не соответствуют *.

С этой целью, bash предоставить возможность сделать * сопоставьте все, даже скрытые объекты:

cd dont-delete-meshopt -s dotglobrm -r ./*

Это может быть полезно для сброса dotglob к своему состоянию по умолчанию (не установленному), если вы продолжаете использовать оболочку, в которой вы выполнили вышеуказанные команды:

shopt -u dotglob 
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Воспользуйся xdev возможность удаления файлов только в пределах границ устройства.

Вы можете использовать find с -delete флаг:

find dontDeleteMe/* -delete

То /* важно, поскольку это говорит find для поиска только ВНУТРИ папки с именем "dontDeleteMe".

Также убедитесь, что -delete флаг находится в конце find команда.

Чтобы удалить (в терминале) все файлы и подкаталоги, за исключением базового каталога с именем "dontdelete":

rm -rf dontdelete/*
rm -rf  directory/{.*,/*}

Что говорит:

Удалите все файлы, начинающиеся с . в "каталоге" и во всех других файлах тоже.

Хотя, как любезно отметил Нефтас это решение это небезопасно!

Более безопасным решением является:

 rm -rf directory/!(.|..)

Есть еще более простой ответ:

  1. cd dontDeleteMe

  2. rm -rf *

Время лекции по основам системного администрирования: Обязательно обращайте внимание на то, где вы находитесь, когда используете подобные команды подметания.

Я не могу сказать этого достаточно. Мне пришлось восстановить коробку, потому что кто-то не обратил внимания и набрал rm -rf * находясь в /.

*nix предполагает, что если вы являетесь root или выполняете sudo от имени root, вы знаете, что делаете. Поэтому убедитесь, что вы знаете, что делаете, прежде чем делать это.

Альтернативой, которая гарантирует, что ваша команда 'cd' сработает, прежде чем вы выдадите 'rm', является использование

cd dontDeleteMe && rm -rf *

Я не уверен, почему это так сложно, помогите мне, если я ошибаюсь

cd DoNotDeleteDir #<- this is just to make sure we are insidefind . | xargs rm -rf

Вот и все

  1. Проще всего для меня - эксперта по Windows, но новичка в ubuntu
  2. Нажмите на значок файлов на панели запуска
  3. Перейдите в каталог, в котором находятся файлы и папки, которые вы хотите удалить
  4. Щелкните правой кнопкой мыши в пустой области окна рядом с файлами и нажмите "Открыть в терминале" - оставьте окно файлов открытым
  5. Откроется окно терминала, которое будет "установлено" в папку, которую вы нашли
  6. Вы можете ввести "dir" (не обращайте внимания на кавычки, когда я говорю "введите") и нажать enter, чтобы терминал отобразил список файлов и папок - просто чтобы доказать, что вы находитесь "в" нужной папке
  7. введите "rm -rf *" и нажмите enter
  8. в зависимости от размера удаляемых папок/файлов система приостановит работу
  9. Когда появится запрос терминала, в окне файлов, которое вы открыли, теперь будет написано "Папка пуста".
  10. Я добился успеха с помощью этого метода, и мне было удобно видеть файлы / папки как в окне Files, так и в результате команды Dir в окне терминала
  11. Я также был утешен тем, что в окне Файлов отображалась папка, которая теперь пуста, особенно с тех пор, как я гонялся за этими файлами в поисках папки корзины, в которой они находились
  12. Спасибо всем остальным, кто прислал ответы - это было очень информативно