Видалення каталогу UNIX з дефісом в імені


13

Шляхом маневру з моєї сторони я випадково створив каталог з назвою (наприклад) -A, і закінчив заповнювати його файлами.

Я хочу видалити вказаний каталог. Я спробував:

rmdir -- -A

але потім мені кажуть, що в каталозі все ще є файли в ньому. І я не можу зрозуміти, як вписати в каталог, щоб видалити вказані файли.

Що мені робити, щоб позбутися цього клопіткого каталогу?


5
На щастя, каталог не був названий '-rf *'.
користувач1686

Те саме на stackoverflow та unix .
Доріан

Відповіді:


29

Використовувати - для кожної команди.

$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ mkdir -- -A
$ ls -la
total 36
drwxr-xr-x  2 richard  richard  512 Jul 28 15:44 -A
drwxr-xr-x  4 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ cd -- -A
$ ls
$ pwd
/home/richard/-A
$ cd ..
$ rm -rf -- -A
$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..

11

Ви можете поставити ./ перед файлом - таким чином rm або rmdir не будуть вести себе так, ніби ім'я файлу - це прапор опції.

Ви також можете випустити опцію - яка вказує rm діяти так, ніби все після - є ім'ям файлу, і він більше не повинен обробляти параметри. Можливо, є прикольні старіші версії rm, які не підкоряються цьому, хоча мій зоопарк антикварних унісеків став досить малим у наші дні, тому я не можу сказати вам, які з них, чи є версії, які не розуміють -.

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



2

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


1
rm -fr ./-A

Наведена вище команда працює для мене.


0

Іншим методом було б видалення за допомогою inode (це працює для файлів / каталогів з іншими символами, які важко видалити лише за допомогою rm).

bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
5172770 make_hosts.pl
bash-3.2$ find . -inum 5172770 -exec rm -f {} \;
bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
bash-3.2$

rm все одно буде передано аргумент -A у командному рядку, і він все ще намагатиметься інтерпретувати його як варіант, тому вам все одно потрібно запобігти тому, щоб він бачив провідний тире якось (через подвійні тире або введенням ./ перед решта імені.
chris

Знахідка автоматично додасть це, оскільки ви знайдете з '.' Ім'я файлу, що передається, буде "./-A", або як би файл не називався, попередньо встановлений ./ і правильно вийшов для команди.
baumgart

Ніт: -execне уникає імені, і не потрібно; аргумент, переданий через один із exec*системних викликів, - це власне ім'я. Тільки введення оболонки потребує спеціальних символів, таких як зірочка з комою з комою тощо, цитується, щоб оболонка передавала правильну (БЕЗ лапок) фактичну назву. Однак це find -exec rm -f {}працює лише для файлу, а не для каталогу, як запитали цей Q; find -exec rm -rf {}працює з каталогом і навіть не порожнім каталогом, але пропускати findта робити rm -rf ./-Aце набагато простіше.
dave_thompson_085

0

find може видалити каталог таким чином:

find . -type d -iname '-A' -delete

-1

Я намагався видалити каталог з іменем -p. @ Відповідь Моо досягнув того, чого я не зміг rm ./-p, і який широко доступний на багатьох веб-сторінках після пошуку в Google.

Інший метод - використання числа inode. Я використовував описаний тут метод:

https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

Якщо коротко, скористайтеся такими командами:

  1. Відображення номера файлу чи каталогу в каталозі.
ls -il
  1. Використовуйте findкоманду, використовуючи -exec rm -irfаргумент для файлу або -exec rm -ifdrдля каталогу.
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

Переконайтеся, що ви використовуєте -fпрапор всередині, інакше bash поскаржиться на те, що не зможе знайти каталог чи файл.

Тестовано на:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial

1
Це майже дублікат відповіді baumgart від 10 років тому, але вам не потрібно rm -dніколи і зазвичай не -fпри виклику find, але вам потрібен -rкаталог і не потрібен для файлу. Навіть при виправленні цей метод все ще незграбний і неповноцінний. Для непорожнього каталогу просто зробіть rm -fr ./-p- це r для каталогу, і f залежно від налаштувань дозволу.
dave_thompson_085

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