Как перейти в каталог с именем «-2» (начиная с дефиса)?


169

У меня есть каталог с именем:

-2

Я хочу, чтобы CD в него, но CD жалуется:

bash: cd: -2: invalid option

Безуспешно я пытался:

cd "-2"
cd '-2'
cd \-2

Любое решение?

Изменить: на сервере нет файловых браузеров, таких как mc и т. Д.


2
Связанный вопрос о суперпользователе: superuser.com/questions/361573/…
yms

Ответы:


272

Как минимум двумя способами:

  1. Используйте --аргумент.

    cd -- -2
    

    При этом используется соглашение, общее для инструментов GNU, которое состоит в том, чтобы не обрабатывать все, что появляется после, --как параметр командной строки.

    Как заметил комментатор , это соглашение также определено в стандарте POSIX :

    Поведение по умолчанию: если этот раздел указан как «Нет», это означает, что реализация не должна поддерживать какие-либо параметры. Стандартные утилиты, которые не принимают параметры, но принимают операнды, должны распознавать "--"в качестве первого аргумента, который должен быть отброшен.

    Требование распознавания "--"заключается в том, что соответствующим приложениям нужен способ защитить свои операнды от любых произвольных опций, которые реализация может предоставить в качестве расширения. Например, если стандартная утилита foo указана как не имеющая опций, и приложению необходимо указать ей путь с начальным дефисом, она смело может сделать это следующим образом:

    foo -- -myfile
    

    и избегайте проблем с использованием -m как расширения.

    а также :

    Принцип 10:
    Аргумент --должен быть принят в качестве разделителя, указывающего конец опций. Любые последующие аргументы должны рассматриваться как операнды, даже если они начинаются с '-'символа. --Аргумент не должен использоваться в качестве опции или в качестве операнда.

  2. Укажите путь явно:

    cd ./-2
    

    Это указывает путь, явно указывающий текущий каталог ( .) в качестве отправной точки.

    cd $(pwd)/-2
    cd /absolute/path/to/-2
    

    Это вариации на выше. Любое количество таких изменений может быть возможным; Я оставлю это в качестве упражнения для читателя, чтобы узнать все из них.


23
Это не просто GNU, это часть стандарта POSIX. См. 1.11 Описание утилит по умолчанию и 12.2 Рекомендации по синтаксису утилит (рекомендация № 10). Со cdстраницы « cdУтилита должна соответствовать ... разделу 12.2».
Дитрих Эпп

Теперь мне просто интересно, как перейти в каталог с именем -!
sergiol

2
@sergiol Точно так же.
Майкл Хэмптон

1
@ArtB: Нет. Цитирование влияет только на разделение полей. Так что "hello world"это один аргумент, но hello worldэто два, и "-2"это то же самое, что и -2.
Дитрих Эпп

1
@sergiol: Либо cd -- --или cd ./--должно работать.
Кит Томпсон


26

Это будет работать, если '-2' находится в текущем каталоге.

    cd ./-2

Вы можете выполнить автозаполнение, набрав - и нажав Tab.



7

Просто для дополнения, если вы хотите удалить / удалить этот каталог, вы можете использовать следующую команду:

rm -r -- -2

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

-1

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

Я запустил приложение Java, и он искал каталог, начинающийся с <path>, я должен был заменить его на правильный путь перед запуском приложения. Однако я забыл это сделать. Приложение создало каталог с именем <path>.

Я попытался cd <path>- дал мне ошибку "-bash: синтаксическая ошибка рядом с неожиданной новой строкой токена" На основе предложенного здесь (я понимаю, что для каталога, начинающегося с - и не <), я попытался cd -- <path>. Однако я получил ту же ошибку.

Когда я попробовал cd \<path>\- это сработало!

Исходная информация:

Символы «<» и «>» используются для перенаправления STDIN и STDOUT, поэтому их необходимо экранировать, чтобы оболочка не интерпретировала их как перенаправления.

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