Wie verwende ich Dateinamen, die mit einem Bindestrich "-" beginnen, als Befehlsargumente?

20

Dies mag eine einfache Frage sein, aber wie verwende ich Dateien, die mit "-" beginnen, in Befehlszeilenprogrammen?

Ich versuche beispielsweise, pdfgrepeine Datei mit dem Namen zu verwenden, -2013-01-01.pdfaber es wird beanstandet, dass für 2, 0, 1, 3 usw. keine Optionen definiert sind.

Das Ändern des Dateinamens in etwas, das nicht mit "-" beginnt, löst das Problem. Dies ist jedoch keine Option, da die Dateien nicht von mir erstellt wurden. Ich möchte nur nach einer bestimmten Änderung suchen, von der ich weiß, dass sie kommt.

Kristoffer
quelle
Dies funktioniert nicht, gibt mir die gleichen Fehler wie zuvor
Kristoffer
3
Als Beispiel grep -i dfv -- -myfile1 -myfile2.
das funktioniert! Vielen Dank! mache es n Antwort und ich kann es als akzeptiert für zukünftige Generationen markieren :)
Kristoffer
@AliNa, hat die Verwendung von Zitaten speziell für Sie mit pdfgrep funktioniert? Es hat bei mir nicht funktioniert. Ich benutze Lubuntu.
4
@AliNa: Anführungszeichen funktionieren nicht, da sie von der Shell und nicht vom Programm interpretiert werden.
Hammar

Antworten:

22

Sehr häufig --wird in der Befehlszeile verwendet, um einem Programm zu signalisieren, dass keine verfügbaren Befehlsschalter mehr verwendet werden. Dies ist besonders nützlich, wenn eine Datei einen Bindestrich enthält, den das Programm als Option interpretieren würde.

  1. Ohne das --wird ein Fehler generiert:

    $ 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. Mit den --verwendeten haben wir einen erfolgreichen Befehl:

    $ 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. pdfgrepist so programmiert, dass verstanden wird --, dass die folgenden Befehlszeilenargumente keine Optionen sind. Die meisten Programme tun dasselbe, aber nicht alle Programme verstehen-- . Bei Programmen, die dies nicht tun, müssen Sie dem Dateinamen Folgendes voranstellen ./:

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

    Dies sollte mit jedem Befehl funktionieren, es sei denn, der Befehl kann aus irgendeinem Grund keinen Pfad akzeptieren, nur einen reinen Dateinamen.

Eine allgemeine Einführung in die Befehlszeile finden Sie in dieser nützlichen PDF-Datei .

Flimm
quelle
4
Leider --hat nicht funktioniert mit allen Kommandozeilenprogrammen. Ich hatte von diesem Kommentar des OP ausgegangen , dass pdfgrepes einer von ihnen ist, der ihn nicht erkennt --. Aber das Akzeptieren schlägt hier etwas anderes vor. In jedem Fall muss ein Programm zum Erkennen codiert werden --. Viele Programme verwenden Bibliotheken, um ihre Argumente zu analysieren, die sie erkennen --. Aber manche tun es nicht und manche sind nicht dafür codiert, es zu erkennen --.
Eliah Kagan
3
Für diejenigen Programme, die --die übliche ./pdfgrep ./-2013-01-01.pdf
Problemumgehung
2
Ja, das Voranstellen ./ist die tragbarste und robusteste Lösung. Funktioniert mit jedem Programm und jeder Unix-Version.
Hlovdal
16

Sie stellen dem Dateinamen ./(oder einen anderen relativen oder absoluten Pfad, der funktioniert) voran . Auf diese Weise ist es portabel.

Beispiel:

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

Die Verwendung von --, um das Ende von Optionen anzuzeigen, ist nicht immer verfügbar. Einige Befehle werden es wissen, andere nicht. Dies wird sich systemübergreifend ändern. Am Ende ist es also weniger portabel.

Olivier Dulac
quelle