Как использовать имена файлов, начинающиеся с тире «-», в качестве аргументов команды?

20

Это может быть простой вопрос, но как мне использовать файлы, начинающиеся с "-", с программами командной строки?

Например, я пытаюсь использовать pdfgrepфайл с именем, -2013-01-01.pdfно он жалуется, что нет опций, определенных для 2, 0, 1, 3 и так далее.

Изменение имени файла на что-то, что не начинается с «-», решает это, но это не вариант, так как файлы не созданы мной. Я просто хочу проверить, есть ли конкретные изменения, которые, я знаю, произойдут.

Кристоффер
источник
Это не работает, дает мне те же ошибки, как и раньше
Кристоффер
3
В качестве примера grep -i dfv -- -myfile1 -myfile2.
это работает! Благодарность! сделай ответ, и я могу пометить его как принятый для будущих поколений :)
Кристоффер
@AliNa, с помощью кавычек у вас работал pdfgrep? Это не сработало для меня. Я использую Lubuntu.
4
@AliNa: кавычки не будут работать, так как они интерпретируются оболочкой, а не программой.
Хаммар

Ответы:

22

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

  1. Без этого --генерируется ошибка:

    $ pdfgrep -i posix -find.pdf -xorg.pdf
    
    pdfgrep: invalid option -- 'f'
    pdfgrep: invalid option -- 'd'
    pdfgrep: invalid option -- '.'
    pdfgrep: invalid option -- 'p'
    pdfgrep: invalid option -- 'd'
    pdfgrep: invalid option -- 'f'
    
  2. С помощью --мы имеем успешную команду:

    $ pdfgrep -i posix -- -find.pdf -xorg.pdf
    
    -find.pdf: on the command line. Currently-implemented types are emacs (this is the default), posix-awk,
    -find.pdf: posix-basic, posix-egrep and posix-extended.
    -find.pdf: posix-basic, posix-egrep and posix-extended.
    -find.pdf: posix-basic, posix-egrep and posix-extended.
    
  3. pdfgrepзапрограммирован, чтобы понимать, --что следующие аргументы командной строки не являются опциями. Большинство программ делают то же самое, но не все программы понимают-- . Для программ, которые этого не делают, решение заключается в добавлении имени файла ./следующим образом:

     pdfgrep -i posix ./-find.pdf ./-xorg.pdf
    

    Это должно работать с любой командой, если только по какой-то причине команда не может принять путь, только чистое имя файла.

Для общего ознакомления с командной строкой, смотрите этот полезный PDF .

Флимм
источник
4
К сожалению, --это не работает с всеми программами командной строки. Из этого комментария ОП я предположил , что pdfgrepэто один из тех, кто не признает --. Но принятие здесь предполагает иное. В любом случае, программа должна быть закодирована для распознавания --. Многие программы используют библиотеки для анализа своих аргументов, которые распознают --. Но некоторые этого не делают, и некоторые из них не закодированы для распознавания --.
Элия ​​Каган
3
Для тех программ, которые не распознают --обычный обходной путь, ставят ./перед файлом:pdfgrep ./-2013-01-01.pdf
Карлос Кампдеррос
2
Да, размещение ./впереди - самое портативное и надежное решение. Работает на любой программе, на любой версии Unix.
Хловдал
16

Вы добавляете имя файла с помощью ./(или другого относительного или абсолютного пути, который работает). Таким образом, это портативно.

Пример:

for zefile in ./*.tmp
do
   rm -f "$zefile"
done

Использование --для обозначения конца опций не всегда доступно. Некоторые команды будут знать это, некоторые - нет. И это изменится в разных системах. Так что, в конце концов, он менее портативный.

Оливье Дюлак
источник