Чи буде 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.