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

20

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

Por ejemplo, estoy tratando de usar pdfgrepun archivo llamado -2013-01-01.pdfpero se queja de que no hay opciones definidas para 2, 0, 1, 3, etc.

Cambiar el nombre del archivo a algo que no comience con "-" lo resuelve, pero esta no es una opción ya que los archivos no son creados por mí. Simplemente quiero verificar si hay un cambio específico que sé que se avecina.

Kristoffer
fuente
esto no funciona, me da los mismos errores que antes
Kristoffer
3
Como ejemplo grep -i dfv -- -myfile1 -myfile2,.
¡eso funciona! ¡Gracias! responda y puedo marcarlo como aceptado para futuras generaciones :)
Kristoffer
@AliNa, ¿el uso de citas funcionó específicamente para usted con pdfgrep? No me funcionó. Estoy usando Lubuntu
44
@AliNa: las comillas no funcionarán, ya que las interpreta el shell, no el programa.
hammar

Respuestas:

22

Con mucha frecuencia --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 intentaría interpretar como una opción.

  1. Sin el --, 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 --usado 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. pdfgrepestá programado para entender --que los siguientes argumentos de la 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 del archivo de ./esta manera:

     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 una introducción general a la línea de comandos, vea este útil PDF .

Flimm
fuente
44
Por desgracia, --no no trabajar con todos los programas de línea de comandos. Asumí por ese comentario del OP que pdfgrepes uno de ellos que no reconoce --. Pero la aceptación aquí sugiere lo contrario. En cualquier caso, un programa debe estar codificado para reconocer --. Muchos programas usan bibliotecas para analizar sus argumentos, que sí reconocen --. Pero algunos no lo hacen, y de ellos, algunos no están codificados para reconocer --.
Eliah Kagan
3
Para aquellos programas que no reconocen --la solución habitual es poner ./delante del archivo:pdfgrep ./-2013-01-01.pdf
Carlos Campderrós
2
Sí, poner ./delante es la solución más portátil y robusta. Funciona en cualquier programa, en cualquier versión de Unix.
hlovdal 05 de
16

Antepone 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á en diferentes sistemas. Entonces, al final, es menos portátil.

Olivier Dulac
fuente