28

Мне было интересно, как создать файл с именем флага, например, если я хочу создать папку с именем -a , какие команды помогут?

Я пробовал mkdir '-a' , mkdir \-a , и ни один из них не работал. Я нахожусь на Ubuntu.

4 ответа4

49

Вызовите команду так:

mkdir -- -a

Параметр -- означает, что после этого опции заканчиваются, поэтому -a интерпретируется буквально, а не как опция для mkdir . Вы найдете этот синтаксис не только в mkdir , но и в любой POSIX-совместимой утилите, кроме echo и test . Из спецификации:

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

Использование -- в качестве гарантии рекомендуется почти для любого действия, когда вы имеете дело с именами файлов и хотите убедиться, что они не нарушают команду, например, при перемещении файлов в цикле вы можете вызвать следующее, чтобы файл с именем -i не (в?)правильно разбирается как опция:

mv -- "$f" new-"$f"
21

Самый простой способ работы с любой приемлемой программой - использовать относительный путь перед - , например, mkdir ./-a , создаст каталог с именем -a в текущем рабочем каталоге.

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

4

Причина, по которой mkdir '-a' или mkdir \-a не работает, заключается в том, что оба эти метода (с использованием кавычек или обратной косой черты) используются для предотвращения того, чтобы ваша оболочка (вероятно, bash) придала им какое-либо особое значение. Так как -a не имеет ничего общего с оболочкой, это никак не влияет на то, как она передается в mkdir .

Что касается mkdir , он получает список аргументов из оболочки и не может определить, помещены ли они в кавычки или нет, или был ли обратный слеш. Он видит только один аргумент -a . Вот почему вам нужно -- как объяснено в других ответах.

-3

В дополнение к ответу от "slhck" есть еще одна хитрость, которая иногда работает:

Поместите имя файла в 2 набора (разных) qoutes, таких как "'-a'" или '"-a"' .

Является ли это работает , зависит от программы, но это в крайнем случае, если программа не поддерживает POSIX -- функцию.
Метод POSIX всегда предпочтителен, поскольку он надежен на 100%.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .