Como uso nomes de arquivos que começam com um traço “-” como argumentos de comando?

20

Essa pode ser uma pergunta simples, mas como posso usar arquivos começando com "-" nos programas de linha de comando?

Por exemplo, estou tentando usar pdfgrepem um arquivo chamado, -2013-01-01.pdfmas ele reclama que não há opções definidas para 2, 0, 1, 3 e assim por diante.

Alterar o nome do arquivo para algo que não comece com "-" resolve, mas isso não é uma opção, pois os arquivos não são criados por mim. Eu simplesmente quero verificar uma alteração específica que eu sei que está por vir.

Kristoffer
fonte
Isso não dos trabalhos, dá-me os mesmos erros de antes
Kristoffer
3
Como um exemplo grep -i dfv -- -myfile1 -myfile2.
isso funciona! obrigado! torná-lo n responder e eu posso marcá-lo como aceite para as gerações futuras :)
Kristoffer
@AliNa, o uso de aspas funcionou especificamente para você com o pdfgrep? Não funcionou para mim. Estou usando o Lubuntu.
4
@ Alii: As aspas não funcionam, pois são interpretadas pelo shell, não pelo programa.
Hammar

Respostas:

22

Com muita freqüência --é usado na linha de comando para sinalizar para um programa que nenhuma outra opção de comando disponível será usada. Isso é particularmente útil se um arquivo contiver um traço, que o programa tentaria interpretar como uma opção.

  1. Sem o --, ocorre um erro:

    $ 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. Com o --usado, temos um comando bem-sucedido:

    $ 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. pdfgrepestá programado para entender --que os seguintes argumentos da linha de comando não são opções. A maioria dos programas faz o mesmo, mas nem todos os programas entendem-- . Para programas que não o fazem, a solução é incluir o nome do arquivo com o seguinte nome ./:

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

    Isso deve funcionar com qualquer comando, a menos que, por algum motivo, o comando não possa aceitar um caminho, apenas um nome de arquivo puro.

Para uma introdução geral à linha de comando, consulte este PDF útil .

Flimm
fonte
4
Infelizmente, --não não funcionar com todos os programas de linha de comando. Eu assumi a partir desse comentário do OP que pdfgrepé um deles que não reconhece --. Mas a aceitação aqui sugere o contrário. Em qualquer caso, um programa deve ser codificado para reconhecer --. Muitos programas usam bibliotecas para analisar seus argumentos, que reconhecem --. Mas alguns não, e desses, alguns não são codificados para reconhecer --.
Elias Kagan
3
Relativamente a esses programas que não reconhecem --a solução usual é colocar ./na frente do arquivo:pdfgrep ./-2013-01-01.pdf
Carlos Campderrós
2
Sim, colocar ./na frente é a solução mais portátil e robusta. Funciona em qualquer programa, em qualquer versão unix.
hlovdal
16

Você precede o nome do arquivo com ./(ou outro caminho relativo ou absoluto que funcione). Desta forma, é portátil.

Exemplo:

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

O uso de --para indicar o final das opções nem sempre está disponível. Alguns comandos sabem disso, outros não. E isso mudará em diferentes sistemas. Então, no final, é menos portátil.

Olivier Dulac
fonte