Как я могу иметь дело с путевыми именами, которые включают проблемные (= мета и пробел оболочки) символы? - PullRequest
2 голосов
/ 26 августа 2011

Часто у меня есть файлы со странными именами, такими как /foo/bar * baka/waka xoxotinh(|).mp3. Как правильно избежать этой вещи на произвольном языке, чтобы правильно ссылаться на файл?

Ответы [ 6 ]

3 голосов
/ 26 августа 2011

Escape каждый зарезервированный символ с \:

/foo/bar\ \*\ baka/waka\ \*\ xoxotinh\(\|\).mp3

или поместите его в кавычки так:

"/foo/bar * baka/waka * xoxotinh(|).mp3"
2 голосов
/ 26 августа 2011

Вы можете избежать его, включив весь путь в '' или экранировав отдельные "странные" символы на \.

Это не всегда простая задача, так что если вы делаете это правильно изbash, затем просто используйте TAB для завершения пути - bash избавит вас от «странных» символов.

Вот как bash избежал его:

cd /foo/bar\ \*\ baka/waka\ xoxotinh\(\|\).mp3/

Примечание: ясоздал путь:

mkdir -p '/foo/bar * baka/waka xoxotinh(|).mp3'
1 голос
/ 26 августа 2011

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

0 голосов
/ 27 августа 2011

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

ls "name with spaces & a single quote->'"' and name with "quotes" and $'

Обратите внимание, как вторая двойная кавычка завершает первую часть, а следующий символ - одиночныйцитата, которая цитирует остаток.Там!Процитировал имя, содержащее обе кавычки!Как только оболочка выполнила удаление кавычек (всегда последняя), ls увидит

name with spaces & a single quote->' and name with "quotes" and $

в качестве одного аргумента.

0 голосов
/ 26 августа 2011

В BASH вы можете использовать двойные кавычки, чтобы удалить значение глобализации * и ?. Обратные удары немного более хлопотно. Вам придется удвоить их.

На самом деле, вы можете просто добавить обратную галочку косой черты перед любым не алфавитным числовым символом в Bash и быть в полной безопасности. Это хорошо работает в Bash для Linux:

newFileName=$(echo -E "$fileName" | sed 's/[^[:alnum:]]/\\/g')
0 голосов
/ 26 августа 2011

Вам нужно либо добавить имя файла между кавычками, например "asd * sdd||ss.mp3", либо escape-символы. Экранирование означает, что вам нужно добавить \ перед каждым недопустимым символом.

в php у вас есть http://www.php.net/manual/en/function.escapeshellarg.php например

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...