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

18

Esta pode ser uma pergunta simples, mas como eu uso arquivos começando com "-" com programas de linha de comando?

Por exemplo, estou tentando usar pdfgrep em um arquivo chamado -2013-01-01.pdf , mas 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 inicia com "-" resolve, mas isso não é uma opção, pois os arquivos não são criados por mim. Eu simplesmente quero verificar uma mudança específica que eu sei que está chegando.

    
por Kristoffer 05.04.2013 / 01:34

2 respostas

21

Freqüentemente -- é usado na linha de comando para sinalizar para um programa que não haverá mais opções de comando disponíveis. Isso é particularmente útil se um arquivo contiver um traço, que o programa tentaria interpretar como uma opção.

  1. Sem o -- , há um erro gerado:

    $ 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. pdfgrep está programado para entender -- para indicar que os seguintes argumentos de 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 é prefixar o nome do arquivo com ./ , assim:

     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 .

    
por user76204 05.04.2013 / 01:52
15

Você prefixou o nome do arquivo com ./ (ou outro caminho relativo ou absoluto que funciona). 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 saberão, outros não. E isso vai mudar em diferentes sistemas. Então, no final, é menos portável.

    
por Olivier Dulac 05.04.2013 / 14:24