Jak używać nazw plików rozpoczynających się od myślnika „-” jako argumentów poleceń?

20

To może być proste pytanie, ale jak korzystać z plików zaczynających się od „-” w programach wiersza poleceń?

Na przykład próbuję użyć pdfgreppliku o nazwie, -2013-01-01.pdfale narzeka, że ​​nie ma zdefiniowanych opcji dla 2, 0, 1, 3 itd.

Zmiana nazwy pliku na coś, co nie zaczyna się od „-”, rozwiązuje go, ale nie jest to możliwe, ponieważ pliki nie są tworzone przeze mnie. Chcę po prostu sprawdzić, czy nadchodzi konkretna zmiana.

Kristoffer
źródło
to nie działa, daje mi takie same błędy jak poprzednio
Kristoffer
3
Jako przykład grep -i dfv -- -myfile1 -myfile2.
to działa! dzięki! zrób to, a ja mogę oznaczyć jako zaakceptowane dla przyszłych pokoleń :)
Kristoffer
@AliNa, czy używanie cudzysłowów działało specjalnie dla Ciebie w pdfgrep? Nie działało to dla mnie. Używam Lubuntu.
4
@AliNa: Znaki cudzysłowu nie będą działać, ponieważ są interpretowane przez powłokę, a nie program.
hammar

Odpowiedzi:

22

Bardzo często --jest używany w wierszu poleceń, aby zasygnalizować programowi, że nie będą używane żadne dostępne przełączniki poleceń. Jest to szczególnie przydatne, jeśli plik zawiera myślnik, który program próbowałby interpretować jako opcję.

  1. Bez tego --generowany jest błąd:

    $ 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. Przy --użyciu mamy udane polecenie:

    $ 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. pdfgrepjest zaprogramowany tak, aby rozumieć, --że następujące argumenty wiersza polecenia nie są opcjami. Większość programów robi to samo, ale nie wszystkie programy rozumieją-- . W przypadku programów, które tego nie robią, rozwiązaniem jest dodanie nazwy pliku przed ./, tak jak poniżej:

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

    Powinno to działać z dowolnym poleceniem, chyba że z jakiegoś powodu polecenie nie może zaakceptować ścieżki, tylko czystą nazwę pliku.

Ogólne wprowadzenie do wiersza poleceń można znaleźć w tym przydatnym pliku PDF .

Flimm
źródło
4
Niestety, --nie nie działa ze wszystkimi programami wiersza polecenia. Z tego komentarza OP założyłem , że pdfgrepjest to jeden z nich, który nie rozpoznaje --. Ale przyjęcie tutaj sugeruje inaczej. W każdym razie program musi zostać zakodowany w celu rozpoznania --. Wiele programów używa bibliotek do analizowania argumentów, które rozpoznają --. Ale niektórzy nie, a niektórzy nie są zakodowani do rozpoznania --.
Eliah Kagan
3
Dla tych programów, które nie rozpoznają --zwykłego obejścia, umieszcza się ./przed plikiem:pdfgrep ./-2013-01-01.pdf
Carlos Campderrós
2
Tak, stawianie ./na pierwszym miejscu to najbardziej przenośne i niezawodne rozwiązanie. Działa w każdym programie, w dowolnej wersji uniksowej.
hlovdal
16

Poprzedzasz nazwę pliku ./(lub inną działającą względną lub bezwzględną ścieżką). W ten sposób jest przenośny.

Przykład:

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

Użycie --znaku końca opcji nie zawsze jest dostępne. Niektóre polecenia to poznają, inne nie. I to się zmieni w różnych systemach. Ostatecznie jest mniej przenośny.

Olivier Dulac
źródło