Чи буде rm -rf * видалити всі файли / папки в поточному каталозі?


20

Чи rm -rf *видалити всі файли / папки з поточного каталогу? Я хочу переконатися, що підстановка *не рухатиметься у верхніх каталогах і видаляє всю мою файлову систему. : D

Я пам'ятаю , робити chmod 777 .* -Rв chmodприхованих файлах і chmodед всю файлову систему. Очевидно, я був на кореневому рахунку.


1
Ось чому я зробив би rm -rf ./*і явно вказав поточний каталог ... але, схоже, Анкур каже, що це все одно не має значення.
mpen

@ Марк: яка різниця між .. і ./ ..? Ви можете спробувати cd ./ .. і подивитися, де ви закінчитесь :)
Йохан

@Johan: Немає різниці ... Я думаю, це просто має більше сенсу в моїй шаленій голові: D
mpen

@Mark: легка помилка :)
Йохан

Відповіді:


15

Ні, якщо ви багато не налаштували оболонку, це не видалить файли чи каталоги, починаючи з а .. Щоб їх також видалити, ви можете або перелічити їх чітко

rm -rf .file .dir

або використовувати правильні шаблони глобуса (дякую Крису)

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

EDIT Справа в тому , що ви не можете використовувати , .*щоб відповідати файли , як .file, так .*чи .*?буде також відповідати ..або .. .[^.]*відповідає файлам на зразок .file, тоді як ..?*файли збігаються на зразок ..foo( *відповідає нулю або більше символів, а ?відповідає точно одному).


1
Вам також потрібно щось на зразок ..?*ловити записи, які починаються з ".." (наприклад ..foo).
Кріс Джонсен

@Chris: Гаразд, я почав це прискіпливе безумство, ти маєш рацію;)
Бенджамін Баньє

справа не тільки у використанні «правильних» шаблонів глобуса, а й у кількості відповідних елементів. в каталогах з величезною кількістю файлів оболонка, швидше за все, не зможе надати 50 к файлів за один раз rm. тож видалення вмісту каталогу за допомогою * не є наймудрішим способом, imho.
акіра

Я думаю, що пояснення xargsтрохи виходить за рамки цього питання. Можна, наприклад, почати думати про це, коли оболонка скаржиться на аргументи списку аргументів.
Бенджамін Баньє

1
Я думаю, що це не виходить за рамки, тому що я думаю, що ОП не впевнений, як досягти його остаточної проблеми / рішення: видаліть увесь вміст каталогу. ОП просто робить загальну "неправильну" річ, маючи на увазі вже рішення (погане) і запитує, чому це рішення викликає проблеми. кращим підходом буде: "як видалити всі файли в каталозі, не видаляючи сам каталог?" Рішення ОП спричинить проблеми через саму природу того, як працює глобалізація.
акіра

12

Якщо ви хочете видалити каталог та весь його вміст, ви можете перейти chdirдо батьківського каталогу та до них, rm -rfякий переходить по імені, обійшовши все глобальне питання. Якщо ви хочете видалити вміст, але зберегти каталог, найпростіше видалити всі, а потім створити каталог.

Складно придумати глобус, який відповідатиме всім можливим збереженням записів каталогів. і ..; легко придумати просту відповідь (наприклад, * .??*), яка буде працювати практично завжди на практиці. Це добре для інтерактивного використання, оскільки його легко запам’ятати, а часи, коли це не працює, можна спіймати за допомогою пост-кару ls -a. Для сценарію простіше зробити видалення всіх та відтворити порожній каталог.


1
Це те, що я б також запропонував: викиньте каталог і
зробіть

Навіть ти це не відповідь, це гарна ідея.
Йохан

10

Оскільки я думаю, що це питання більше стосується того, що * робить (а не rm), спробуємо інший підхід.


Якщо ви не впевнені, що робить *, ви можете "перевірити" спершу, використовуючи нешкідливу команду на зразок ехо. Перш ніж запустити це, спробуйте вгадати, що вони покажуть, якщо ви запустите їх у своєму домашньому режисері.

echo *
echo .*

Але спочатку давайте створимо ігровий майданчик, щоб ми могли пограти з зірками і побачити, що ми закінчимо.

mkdir ~/star_test/
cd ~/star_test/
>.file1
>file2

Тепер у цьому режимі ми маємо це:

cj@zap:~/star_test$ ls -1a
.
..
.file1
file2

Тепер зауважте, на що * перетворюється * за допомогою команди echo:

cj@zap:~/star_test$ echo *
file2
cj@zap:~/star_test$ echo .*
. .. .file1

Отже, давайте подивимося, що відбувається з командою rm

cj@zap:~/star_test$ rm -rf *
cj@zap:~/star_test$ ls -1a
.
..
.file1

Як ви бачите, він видалив лише файл2, оскільки * розширився лише на файл2. Якщо ви введете rm -rf. *, Це буде те саме, що і писати

rm -rf . .. .file1

І якщо чесно, це не виглядає весело;)

Сподіваємось, це пояснює * частину вашого питання.


Оновлення: Однак, як зазначає Анкур Гоел, існує якийсь захист, вбудований у rm (такий собі незвичний для команд оболонки :)

Давайте створимо новий ігровий майданчик:

cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2

Отож, ми знову маємо це, але з test1, що належить root, як захист, якщо rm починає переходити до берсерка.

cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
cj@zap:~/star_test/test1/test2/test3$ echo .*
. .. .file1

Тож давайте все видалимо:

cj@zap:~/star_test/test1/test2/test3$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2

І схоже, що rm не зняли. і .. навіть якщо ми сказали йому !!!

Тож після цієї довгої відповіді виявляється, що безпечно прибрати все в режимі з цим:

rm -rf * .*

Але я б використовував це обережно, оскільки я не впевнений, що всі реалізації rm поводяться так!


7

Так. rm -rf видалить лише файли та папки в поточному каталозі, і не підніметься до дерева файлів. rm також не буде слідувати посиланнями та видаляти файли, на які вони вказують, тому ви не випадково обріжете інші частини вашої файлової системи.


1

Якщо ви не хочете переміщуватися на один рівень вгору, як сказано mpez0, і в rm -rfцій конкретній папці, є спосіб працювати з усіма каталогами / файлами, крім .та ..в поточній папці, виконавши:

rm -rf $(ls -A)

Звичайно, якщо будь-який із каталогів / файлів містить один із символів IFSспеціальної змінної оболонки (наприклад, пробіл, вкладка, новий рядок), ви можете спершу змінити IFS, запустити команду, а потім відновити IFS.


0

Набагато простішим способом спорожнення всієї папки, а також уникнення питань "занадто багато аргументів", обговорених у цій відповіді , є просто видалення та відновлення самого каталогу. Щоб переконатися, що це працює правильно, коли ви знаходитесь у каталозі з посиланнями, використовуйте наступні рядки:

cd ..
rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink
                        # by using readlink, to recreate the linked-to directory
mkdir $(readlink -f yourdir) # recreate the directory to have it empty
cd yourdir

(Якщо ви використовуєте yourdirзамість цього, $(readlink -f yourdir)ви замінюєте лише посилання, поки вихідне місце залишається повним)


1
Це може зламати речі, покладаючись на inode папки, та викинути дозволи, atime / mtime / ctime / btime, розширені атрибути та списки контролю доступу.
Даніель Бек

@DanielBeck дякую, хороші бали. Хоча мені цікаво, на чому б справедливо покластися на inode, крім жорстких посилань (на каталоги, які все-таки сильно не перешкоджають)? Але важливі дозволи тощо. Тож у найзагальнішому випадку, мабуть, слід використовувати xargs...
Тобіас Кіенцлер

OS X містить механізм, який може обробляти файли та папки, які переміщуються, і все ще зберігають асоціацію. Найбільш помітно в меню " Відкрити останні документи" . AFAICT, він використовує inode для досягнення цього внутрішньо. Більше інформації . Я не був би здивований, якби інші системи реалізували щось подібне, наприклад, в API для програм GUI.
Даніель Бек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.