Как удалить все скрытые файлы и каталоги, используя Bash?

28

Очевидное решение дает код выхода 1:

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

Одно из возможных решений - пропустить "." и каталоги "..", но удаляются только файлы, имена которых длиннее 3 символов:

bash$ rm -f .??*
Йонатан Броза
источник
Хорошо, если вы не слишком беспокоитесь о невозможности удаления. & .. тогда кого это волнует? если вы не беспокоитесь о некрасивом выводе в сценарии, то я думаю, что очевидное решение - это менее типичное, чем другие, откровенно говоря.
Мэтт
Просто чтобы ты знал, .. и. не файлы. Это ссылки на каталоги. , (только одна точка) - текущий каталог, а .. (две точки) - ссылка на каталог на один уровень выше. Например, если cd / home / user,. равно / home / user и .. is / home / Другими словами, вы не можете удалить. и .. (.?)
Фузион
Спасибо за комментарий Мэтт. Я часто использую команду в сценариях с проверкой кода завершения каждой команды (set -e). В этих случаях необходим ориентировочный код выхода.
Йонатан Броза
Там нет ничего, присущего. и .. который защищает их от удаления с помощью rm -rf. Это просто защитный механизм, добавленный в современные вариации rm.
Кубанчик
И всегда есть rm -rf. * || true, если вы просто хотите обойти поведение set -e для этого одного оператора.
Доминго Игнасио Галдос

Ответы:

34
rm -rf. [^.]. ?? *

Надо ловить все дела. . ?? * будет соответствовать только 3+ символьным именам файлов (как объяснено в предыдущем ответе),. [^.] Будет перехватывать любые две символьные записи (кроме ..).

Рассел Хиллинг
источник
Спасибо за ответ! Основываясь на этом, я также получил более короткую версию "rm -rf. [^.] *".
Йонатан Броза
4
Будьте осторожны с этой более короткой версией, она даст аналогичные, но не идентичные результаты. Он не будет совпадать с именами с двумя точками спереди (например, «... /», который иногда можно увидеть скрывающим руткиты и т. Д.)
Рассел Хиллинг
И будьте осторожны, чтобы проверить PWD или потерять все настройки :)
kommradHomer
Это не похоже на работу zsh. Какие-либо предложения?
ryanjdillon
По zshумолчанию пустое подстановочное совпадение считается ошибкой; тогда как с bashним просто передается без изменений. Чтобы заставить zshсебя вести себя так же, вы можете использовать командуunsetopt nomatch
Рассел Хиллинг
1
find -path './.*' -delete

Это сопоставляет все файлы в текущем каталоге, которые начинаются с a, .и рекурсивно удаляет их. Скрытые файлы в не скрытых каталогах не затрагиваются.

В случае, если вы действительно хотите стереть все из каталога, find -deleteбудет достаточно.

ломаться
источник
Это удалит все, не только те записи, которые начинаются с.
kasperd
О, кажется, я неправильно понял вопрос как "удалить все, включая скрытые файлы" ... Ну, мой плохой.
Фриц
@kasperd Спасибо, теперь нужно ответить на вопрос.
Фриц
0

Лучший способ, вероятно, это:

  • находить . -iname. * -maxdepth 1 -type f -exec rm {} \;

замените rm на ls -l, если вы просто хотите посмотреть, что будет удалено, для подробного вывода вы можете добавить опцию -v к rm

  • -type f указывает, что команда find ищет только файлы (не указывайте каталоги, ссылки и т. д.)
  • -maxdepth 1 говорит найти не идти в подкаталоги

пс. не забывайте заканчивать '\;'


источник
1
Осторожный! Вы имеете в виду -iname '. *' Или -iname. * Или вы будете втягивать. и ... опять все равно.
Доминго Игнасио Галдос
-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.
SergioAraujo
источник
Это прерывает момент, когда у вас есть файл с пробелом в его имени.
CVn