Удаление каталога UNIX с дефисом в имени


13

С моей стороны я случайно создал каталог (например) -A и заполнил его файлами.

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

rmdir -- -A

но тогда он говорит мне, что в каталоге все еще есть файлы. И я не могу понять, как перейти в каталог, чтобы удалить указанные файлы.

Что я должен сделать, чтобы избавиться от этого хлопотного каталога?


5
К счастью, каталог не был назван -rf *.
user1686

То же самое на 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 не удалит каталог с чем-либо внутри него. "рм-рф" будет. 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 в командной строке и все равно будет пытаться интерпретировать его как опцию, поэтому вам все равно нужно не допустить, чтобы он каким-либо образом видел начальную черту (через двойные черты или поставив ./ перед Остальное имя.
Крис

Поиск автоматически добавит это, поскольку вы находите из '.'. Переданное имя файла будет «./-A», или как там может быть вызван файл, с префиксом ./ и соответствующим образом экранированный для команды.
Баумгарт

Nit: -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. Ответ @ Moo достиг того, с чем я не смог rm ./-p, что широко доступно на многих веб-страницах после поиска в Google.

Другой метод заключается в использовании номера индекса. Я использовал метод, описанный здесь:

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
Это почти дублирует ответ Баумгарта от 10 лет назад, но вам не нужно rm -dникогда и обычно не -fпри вызове из find, но вам нужен -rкаталог, а файл не нужен. Даже после исправления этот метод все еще неуклюж и неполноценен. Для непустого каталога просто сделайте rm -fr ./-p- это r для каталога, и f в зависимости от настроек разрешения.
dave_thompson_085

1
Оба метода уже упоминались в предыдущих ответах.
Ральф Фридл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.