Come si usano i nomi di file che iniziano con un trattino "-" come argomenti del comando?

18

Questa potrebbe essere una semplice domanda, ma come faccio a utilizzare i file che iniziano con "-" con i programmi della riga di comando?

Ad esempio, sto cercando di usare pdfgrep su un file chiamato -2013-01-01.pdf ma si lamenta che non ci sono opzioni definite per 2, 0, 1, 3 e così via.

Cambiare il nome del file in qualcosa che non inizia con "-" lo risolve, ma questa non è un'opzione in quanto i file non vengono creati da me. Voglio semplicemente verificare un cambiamento specifico che so sta arrivando.

    
posta Kristoffer 05.04.2013 - 01:34

2 risposte

21

Molto frequentemente -- viene usato sulla riga di comando per segnalare a un programma che non saranno più utilizzati commutatori di comando. Ciò è particolarmente utile se un file contiene un trattino, che il programma proverebbe a interpretare come un'opzione.

  1. Senza -- , viene generato un errore:

    $ 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. Con -- usato abbiamo un comando con successo:

    $ 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 è programmato per comprendere -- per indicare che i seguenti argomenti della riga di comando non sono opzioni. La maggior parte dei programmi fa lo stesso, ma non tutti i programmi comprendono -- . Per i programmi che non lo fanno, la soluzione è anteporre il nome del file con ./ , come questo:

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

    Questo dovrebbe funzionare con qualsiasi comando, a meno che per qualche ragione il comando non possa accettare un percorso, solo un nome file puro.

Per un'introduzione generale alla riga di comando, vedi questo utile PDF .

    
risposta data user76204 05.04.2013 - 01:52
15

Si antepone il nome del file con ./ (o un altro percorso relativo o assoluto che funziona). In questo modo è portatile.

Esempio:

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

L'uso di -- per indicare la fine delle opzioni non è sempre disponibile. Alcuni comandi lo sapranno, altri no. E questo cambierà tra diversi sistemi. Quindi, alla fine, è meno portabile.

    
risposta data Olivier Dulac 05.04.2013 - 14:24

Leggi altre domande sui tag