Як видалити всі приховані файли та каталоги за допомогою 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 / Іншими словами, ви не можете видалити. і .. (.?)
phuzion

Дякую за коментар Метт. Я часто використовую команду в скриптах з перевіркою коду виходу команди (set -e). У цих випадках необхідний орієнтовний код виходу.
Йонатан Броза,

Нічого не притаманне. і .. що захищає їх від видалення з rm -rf. Це лише механізм захисту, який додають у сучасних варіантах rm.
kubanczyk

І завжди є rm -rf. * || вірно, якщо ви просто хочете обійти задану поведінку -e для цього одного твердження.
Домінго Ігнасіо Гальдос

Відповіді:


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

Слід ловити всі випадки. . ?? * відповідатиме лише файлам 3+ символів (як пояснено у попередній відповіді).


Дякую за відповідь! На основі цього я також потрапив до коротшої версії "rm -rf. [^.] *".
Йонатан Броза

4
Будьте обережні з цією коротшою версією, вона дасть подібні, але не однакові результати. Він не збігатиметься з іменами з двома крапками спереду (наприклад, "... /", яку іноді можна побачити, ховаючи руткіти тощо)
Рассел Хелінг

І будьте обережні, щоб зробити перевірку PWD або втратити всі свої налаштування :)
kommradHomer

Це, здається, не працює zsh. Будь-які пропозиції?
ryanjdillon

З zshза замовчуванням порожній підстановочний знак трактується як помилка; тоді як з bashнею просто проходить без змін. Щоб змусити zshсебе вести себе так само, ви можете скористатися командоюunsetopt nomatch
Рассел Хайлінг

1
find -path './.*' -delete

Це відповідає всім файлам у поточному каталозі, які починаються з а .та видаляє їх рекурсивно. Приховані файли в не прихованих каталогах не торкаються.

У випадку, якщо ви дійсно хотіли стерти все з каталогу, find -deleteвистачить.


Це видалить усе, не лише ті записи, які починаються з.
kasperd

О, схоже, я неправильно прочитав питання як "видалити все, включаючи приховані файли" ... Ну, моє погано.
Фріц

@kasperd Дякую, тепер він насправді повинен відповісти на питання.
Фріц

0

Мабуть, найкращий спосіб:

  • знайти. -iname. * -maxdepth 1 -тип f -exec rm {} \;

змінити rm на ls -l, якщо ти просто хочеш побачити, що буде видалено, щоб докладно вивести u, можливо, захочеться додати -v параметр rm

  • -типи f- параметри вказують команду find шукати лише файли (опустити dirs, посилання тощо)
  • -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.

Це порушує момент, коли у вас є файл з пробілом у його імені.
CVn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.