Назад | Перейти на главную страницу

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

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

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

rmdir -- -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 ..
$ 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 ..

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

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

Вы должны иметь привычку ставить ./ перед именами, когда вы все равно удаляете - вы никогда не узнаете, есть ли в вашем каталоге файл с именем -r или -rf. Вы могли бы сказать, что вам всегда следует использовать - но я считаю, что ./ более естественен, потому что он явно указывает, что «Я хочу удалить файлы в этом каталоге, а не то, что * происходит с глобусом»

Переименуйте его, а затем обработайте его как обычно:

$ mv -- -A foo
$ find foo
$ rm -rf foo

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

rm -fr ./-A

У меня работает указанная выше команда.

Другой метод - удаление по индексу (это работает для файлов / каталогов с другими символами, которые трудно удалить с помощью 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$

find может удалить каталог следующим образом:

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

Я столкнулся с подобной ситуацией, когда я случайно создал папку -p из-за того, что сценарий создания каталога, предоставленный моим членом команды, содержит специальный символ в части -p.

И т. Д .: mkdir –p / home / web / country / pl / temp

mkdir: невозможно создать каталог `/ home / web / country / pl / temp ': нет такого файла или каталога

Я обнаружил, что каталог -p создан в каталоге / home / web / country /

drwxr-x --- 2 web web 4096 20 июня, 19:22 –p /

Я пытался удалить, используя указанную выше опцию rm -rf - -p

Это не работает, папка все еще там (возможно, потому, что -p - это специальные символы / не ascii)

Мне удалось удалить эту папку, используя команду ниже

rm -r * p

Поскольку у меня нет другой папки с * p в имени, я считаю, что ее можно сохранить, чтобы попробовать это.

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

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

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

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

  1. Для отображения номера inode файла или каталога.
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