Как перейти в каталог с именем, содержащим пробелы в Bash?

84

Я пытался cd "~/Library/Application Support/" -bash: cd: ~/Library/Application Support/: No such file or directory

также cd ~/Library/Application Support/ -bash: cd: ~/Library/Application Support/: No such file or directory

colinfang
источник

Ответы:

113

Вы можете использовать Tabклавишу после нажатия несколько первых символов (это будет «заполнить» остальные папки для вас , например , типа cd ~/LTabзаполняет cd ~/Library/тот типа , ApTabи он будет заполнить остальные для вас.

Если между словами есть пробел, и вы не хотите использовать методы, описанные выше, поставьте \(обратную косую черту) перед пробелом, например cd ~/Library/Application\ Support.

robzolkos
источник
Путь к регистру чувствителен или нечувствителен? Я могу получить доступ к библиотеке через cd ~ / library, но метод tab не будет работать, если я ошибся регистром.
Колинфанг
@colinfang OS X нечувствителен к регистру, но сохраняет регистр. Оболочка bash должна быть немного более разборчивой, когда дело доходит до автозаполнения.
NReilingh
@NReilingh - Ага, спасибо.
Колинфанг
1
@colinfang: Вы можете использовать shopt -s nocaseglobи bind 'set completion-ignore-case on'сделать bash менее чувствительным к регистру.
Крис Джонсен
2
colinfang - для завершения ввода без учета регистра с совместимостью с bash попробуйте 'zsh'. Также подстановочный знак этой оболочки очень хорош.
Ɱark Ƭ
27

Основная проблема здесь заключается в том, как оболочка ( bash ) делает кавычки и как это влияет на раскрытие тильды и разбиение на «слова» (аргументы для запускаемой программы).

bash обрабатывает только ведущую тильду, если она не указана. Кроме того, следующий слеш также не должен быть в кавычках.

В то же время, bash анализирует командные строки в «слова» на основе пробелов без кавычек. cdКоманда , как правило , требуется ровно один аргумент (каталог назначения). Командная строка like cd foo barозначает запуск cdс двумя аргументами: fooи bar. Если вы хотите отправить только один foo barаргумент, то вам нужно заключить в кавычки пробел:
(например) cd foo\ bar(см. Пример цитирования ниже).

В вашей конкретной ситуации вы должны оставить тильду и следующую косую черту без кавычек при указании пробела в имени каталога. Ваша cd "~/Library/Application Support/"проба заканчивает тем, что цитирует слишком много (тильда и ее косая черта), в то время как ваша cd ~/Library/Application Support/проба цитирует слишком мало (она не цитирует пробел в имени каталога).

Наиболее распространенным решением является использование односимвольного экранирования для кавычки только пробела:

    cd ~/Library/Application\ Support

Вы также можете использовать одинарные или двойные кавычки вокруг пробела или пробела и некоторых других битов этого аргумента (но не в ~/!):

    cd ~/Library/Application' 'Support
    cd ~/Library/Application" "Support
    cd ~/Library/App'lication 'Support
    cd ~/Library/Application" Supp"ort
    cd ~/'Library/Application 'Support
    cd ~/"Library/Application "Support

Эти виды цитат имеют разные значения, но они идентичны в этих примерах. Одинарные кавычки защищают буквенные строки, в то время как двойные кавычки допускают различные расширения и замены в указанном регионе.

Часто вы можете просто позволить оболочке сделать всю работу за вас.

  • Globbing (подстановочные знаки):

    cd ~/L*/Ap*

    Вы можете использовать, shopt -s nocaseglobчтобы сделать регистр нечувствительным к регистру:

    cd ~/l*/ap*
  • Завершение:

    Нажатие Tabпосле ввода cd ~/L, вероятно, расширит его до cd ~/Library/.
    Повторное нажатие Tabпосле ввода Ap(теперь у вас есть cd ~/Library/Ap), вероятно, расширит его до cd ~/Library/Application\ Support/(оболочка автоматически вставила экранирующий обратный слеш).

    Вы можете использовать, bind 'set completion-ignore-case on'чтобы сделать регистр нечувствительным к регистру:

    cd ~/l Tabcd ~/Library/; ap Tabcd ~/Library/Application\ Support/

Крис Джонсен
источник
хороший ответ @Chris. Как вы заставили символы табуляции выглядеть как клавиши?
robzolkos
4
@RobZ: это <kbd></kbd>тег HTML (один из нескольких тегов HTML, поддерживаемых в уценке SE ).
Крис Джонсен
9

Когда вы дважды цитируете путь, вы останавливаете расширение тильды. Таким образом, есть несколько способов сделать это:

cd ~/"My Code"
cd ~/'My Code'

Тильда здесь не указана, поэтому расширение тильды все равно будет запущено.

cd "$HOME/My Code"

Вы можете раскрыть переменные окружения внутри строк в двойных кавычках; это в основном то, что делает расширение тильды

cd ~/My\ Code

Вы также можете экранировать специальные символы (например, пробел) с помощью обратной косой черты.

useralone
источник
9

Вы также можете просто перетащить папку в окно терминала, полный путь к файлу / папке будет автоматически вставлен при перетаскивании.

Psychic2k
источник
4

Вы должны покинуть пространство в " Application Support"

Пытаться $ cd ~/Library/Application\ Support/

NReilingh
источник
0

Если нормальные способы не работают, попробуйте заменить пробелы на %20.

Это сработало для меня при работе с SSH и другими командами в стиле домена, такими как auto_smb.

atwixtor
источник
0

Вы можете попробовать это для разнесенных папок / файлов: Если имя файла или папки содержит 1) имя файла .extension, команда должна быть cd ~ / file \ name.extension / (или) cd ~ / "file name.extension" /

прасант сиванесан
источник
1
Как этот ответ отличается от других похожих ответов или улучшает их?
ФСБ
Это идеальный терминальный синтаксис для определения пространства и предоставления кавычек - один из определяемых пользователем, а также использование клавиши табуляции не принимает имя как 1) filename.ext 2) имя файла.ext При нажатии клавиши табуляции для этого типа имени автоматически Завершение слов отображается до «файла», тогда мы можем использовать эту обратную косую черту, чтобы определить пространство в терминале. @fsp
прасант сиванесан
Вся эта информация должна быть в Ответе, чтобы показать читателям, как она отличается от 9 других Ответов, включая принятый Ответ.
ФСБ