¿Cómo uso los nombres de archivo que comienzan con un guión "-" como argumentos de comando?

18

Esta puede ser una pregunta simple, pero ¿cómo uso los archivos que comienzan con "-" con los programas de línea de comando?

Por ejemplo, estoy tratando de usar pdfgrep en un archivo llamado -2013-01-01.pdf , pero se queja de que no hay opciones definidas para 2, 0, 1, 3, etc.

Cambiar el nombre del archivo a algo que no comienza con "-" lo soluciona, pero esta no es una opción ya que los archivos no los creo yo. Simplemente quiero verificar si hay un cambio específico que sé que se aproxima.

    
pregunta Kristoffer 04.04.2013 - 23:34

2 respuestas

21

Muy frecuentemente -- se usa en la línea de comandos para indicar a un programa que no se usarán más interruptores de comando disponibles. Esto es particularmente útil si un archivo contiene un guión, que el programa trataría de interpretar como una opción.

  1. Sin -- , se genera un error:

    $ 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 el -- utilizado tenemos un comando exitoso:

    $ 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 comprender -- para indicar que los siguientes argumentos de línea de comandos no son opciones. La mayoría de los programas hacen lo mismo, pero no todos los programas entienden -- . Para los programas que no lo hacen, la solución es anteponer el nombre de archivo con ./ , así:

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

    Esto debería funcionar con cualquier comando, a menos que por alguna razón el comando no pueda aceptar una ruta, solo un nombre de archivo puro.

Para obtener una introducción general a la línea de comandos, consulte este PDF útil .

    
respondido por el user76204 04.04.2013 - 23:52
15

Anote el nombre del archivo con ./ (u otra ruta relativa o absoluta que funcione). De esta manera es portátil.

Ejemplo:

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

El uso de -- para indicar el final de las opciones no siempre está disponible. Algunos comandos lo sabrán, otros no. Y esto cambiará a través de diferentes sistemas. Entonces, al final, es menos portátil.

    
respondido por el Olivier Dulac 05.04.2013 - 12:24

Lea otras preguntas en las etiquetas