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.


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 .


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.