Как записать cd в каталог с пробелом в имени?
Я пытаюсь попасть в каталог /cygdrive/c/Users/my dir/Documents
:
$ DOCS="/cygdrive/c/Users/my\ dir/Documents"
$ echo $DOCS
/cygdrive/c/Users/my\ dir/Documents
$ cd $DOCS
-bash: cd: /cygdrive/c/Users/my\: No such file or directory
$ cd /cygdrive/c/Users/my\ dir/Documents
(success)
Когда я набираю его вручную, backspace выполняет функцию escape-символа, но не тогда, когда я использую расширение параметра с помощью переменной DOCS
.
Я пробовал другие варианты, такие как отсутствие обратной косой черты.
$ DOCS=/cygdrive/c/Users/Rahman\ dir/Documents
$ echo $DOCS
/cygdrive/c/Users/my dir/Documents
$ cd $DOCS
-bash: cd: /cygdrive/c/Users/my: No such file or directory
или
$ DOCS="/cygdrive/c/Users/my dir/Documents"
$ echo $DOCS
/cygdrive/c/Users/my dir/Documents
$ cd $DOCS
-bash: cd: /cygdrive/c/Users/my: No such file or directory
То же самое происходит с $HOME
:
$ echo $HOME
/home/my dir
cd $HOME
тоже не работает. Кавычки должны быть помещены вокруг этого.
Какого черта:
$ DOCS="\"/cygdrive/c/Users/my dir/Documents\""
$ echo $DOCS
"/cygdrive/c/Users/my dir/Documents"
$ cd $DOCS
-bash: cd: "/cygdrive/c/Users/my: No such file or directory
Ответы
Ответ 1
$ cd "$DOCS"
Вам нужно процитировать "$DOCS"
, чтобы предотвратить разбор пространств как разделителей слов. Чаще всего не следует указывать ссылки на переменные.
Обратите внимание, что $HOME
будет иметь одинаковую проблему. Проблема возникает, когда оболочка оценивает ссылки на переменные; это не имеет никакого отношения к тем, какие переменные вы используете или как вы их назначаете. Это расширение, которое нужно процитировать.
$ echo $HOME
/home/my dir
Это обманчиво. echo
на самом деле повторяет две строки /home/my
и dir
. Если вы используете cd
или ls
, вы увидите, как он работает.
$ ls $HOME
ls: cannot access /home/my: No such file or directory
ls: cannot access dir: No such file or directory
$ cd $HOME
bash: cd: /home/my: No such file or directory
$ cd "$HOME"
<success!>
Могу ли я спросить, почему это работает, когда я вручную ввожу его, но не в переменную?
Отличный вопрос! Давайте рассмотрим команды, которые вы набрали:
$ DOCS="\"/cygdrive/c/Users/my dir/Documents\""
$ echo $DOCS
"/cygdrive/c/Users/my dir/Documents"
$ cd $DOCS
-bash: cd: "/cygdrive/c/Users/my: No such file or directory
Причина, по которой это не работает, состоит в том, что Bash не анализирует кавычки во внутренних разложениях. Он выполняет разбиение слов, поэтому пробелы в разметках без кавычек принимаются как разделители слов. Он не анализирует кавычки каким-либо образом, то есть вы не можете поместить двойные кавычки внутри переменной, чтобы переопределить расщепление слов.
$ cd $DOCS
Из-за этого cd
передается два параметра. Насколько известно cd
, похоже, что вы написали:
$ cd '"/cygdrive/c/Users/my' 'dir/Documents"'
Два параметра без двойных кавычек.
Ответ 2
РЕШЕНИЕ:
cd "Documents and Photos"
проблема решена.
Причина, по которой я отправляю этот ответ, заключается в том, что вы обнаружите, что StackOverflow используется каждым пользователем (а не только веб-разработчиками, программистами или опытными пользователями), и это был результат номер один для простого вопроса пользователя Windows Google.
Люди становятся более технически подкованными, но не обязательно знакомы с командной строкой в приведенных выше случаях.
Ответ 3
$ DOCS="/cygdrive/c/Users/my\ dir/Documents"
Вот ваша первая проблема. Это помещает фактический символ обратной косой черты в $DOCS
, как вы можете видеть, выполнив эту команду:
$ echo "$DOCS"
/cygdrive/c/Users/my\ `
При определении DOCS
вам нужно избежать символа пробела. Вы можете процитировать строку (используя одиночные или двойные кавычки), или вы можете избежать только символа пробела с помощью обратного слэша. Вы не можете обойти оба. (В большинстве Unix-подобных систем вы можете иметь обратную косую черту в имени файла или каталога, хотя это не очень хорошая идея. В Cygwin или Windows, \
является разделителем каталогов. Но я собираюсь принять фактическое имя каталога my dir
, а не my\ dir
.)
$ cd $DOCS
Это передает два аргумента cd
. Первый - cygdrive/c/Users/my\
, а второй - dir/Documents
. Бывает, что cd
спокойно игнорирует все, кроме первого аргумента, что объясняет сообщение об ошибке:
-bash: cd: /cygdrive/c/Users/my\: No such file or directory
Чтобы установить $DOCS
имя вашего каталога Documents
, выполните одно из следующих действий:
$ DOCS="/cygdrive/c/Users/my dir/Documents"
$ DOCS='/cygdrive/c/Users/my dir/Documents'
$ DOCS=/cygdrive/c/Users/my\ dir/Documents
Как только вы это сделали, чтобы перейти в каталог Documents
, заключите ссылку на переменные в двойные кавычки (это хорошая идея для любой ссылки на переменные в bash, если вы не уверены, что значение не есть забавные персонажи):
$ cd "$DOCS"
Вы также можете подумать о том, чтобы дать этому каталогу имя без каких-либо пробелов в нем, хотя это может быть сложно сделать вообще в Windows.
Ответ 4
Почему бы не поместить следующее в .cshrc
(или .bashrc
или что-то из вашей оболочки по умолчанию):
alias mydoc 'cd "/cygdrive/c/Users/my dir/Documents"'
В первый раз, когда вы это делаете, вы должны сделать
source .cshrc
чтобы обновить оболочку с помощью этого нового псевдонима, вы можете ввести
mydoc
в любое время, когда вы хотите cd
в свой каталог.
Лень - мать изобретения...
Ответ 5
Если вы хотите перейти от c:\
и хотите перейти на c:\Documents and settings
, напишите на консоли: c:\Documents\[space]+tab
и cygwin автоматически закроет его как c:\Documents\ and\ settings/
Ответ 6
попробуйте
DOCS="/cygdrive/c/Users/my\ dir/Documents";
cd "$DOCS"
Ответ 7
ok Я потратил некоторое разочаровывающее время на эту проблему. Мой маленький гид.
Откройте рабочий стол, например. Если вы не переключили свой диск в cmd, введите:
рабочий стол cd
Теперь, если вы хотите отобразить подпапки:
cd, сделайте 1 пробел и нажмите вкладка 2 раза
Теперь, если вы хотите ввести каталог/файл с ПРОБЕЛОМ NAME. Давайте откроем некоторое имя файла f.g., чтобы открыть его, нам нужно ввести:
cd файл\имя
p.s. обратите внимание на это пространство после слэша:)
Ответ 8
Используйте символ обратной косой черты, чтобы выйти из пробела
C:\> cd my folder
будет
C:\> cd my\folder
Ответ 9
МЕТОД 1: с цитатами
cd "C: /Prgram Files (x86)"
cd 'C: /Program Files (x86)'
обобщенный
cd 'Folder Path'
Метод 2: без использования кавычек
cd Program\ Files \(x86\)
Обобщенный Когда мы хотим пропустить следующий символ, мы используем черный слэш \
.
По вышеуказанному вопросу: cd/cygdrive/c/Users/my\ dir/Documents
Ответ 10
У Cygwin есть проблема с распознаванием пробела между именами ПК. Таким образом, чтобы решить эту проблему, вы должны использовать "\" после первого слова, затем включить пробел, а затем фамилию.
такие как ".../my\dir/"
$ cd /cygdrive/c/Users/my\ dir/Documents
Еще один интересный и простой способ сделать это, заключить каталог в кавычки ("")
например, запустите его следующим образом:
$ cd c:
$ cd Users
$ cd "my dir"
$ cd Documents
Надеюсь, что это работает?
Ответ 11
В качестве альтернативы использованию кавычек, для каталога, в который вы хотите часто заходить, вы можете использовать опцию оболочки cdable_vars
:
shopt -s cdable_vars
docs='/cygdrive/c/Users/my dir/Documents'
Теперь, чтобы перейти в этот каталог из любого места, вы можете использовать
cd docs
и оболочка укажет на какой каталог она изменилась:
$ cd docs
/cygdrive/c/Users/my dir/Documents
Ответ 12
Вместо:
DOCS="/cygdrive/c/Users/my\ dir/Documents"
Пытаться:
DOCS="/cygdrive/c/Users/my dir/Documents"
Это должно работать на любой системе POSIX.