Comment utiliser les noms de fichiers commençant par un tiret «-» comme arguments de commande?

20

Cela peut être une question simple, mais comment utiliser des fichiers commençant par "-" avec des programmes en ligne de commande?

Par exemple, j'essaie d'utiliser pdfgrepsur un fichier nommé -2013-01-01.pdfmais il se plaint qu'il n'y a pas d'options définies pour 2, 0, 1, 3 et ainsi de suite.

Changer le nom de fichier en quelque chose qui ne commence pas par "-" le résout, mais ce n'est pas une option car les fichiers ne sont pas créés par moi. Je veux simplement vérifier si un changement spécifique que je sais arrive.

Kristoffer
la source
cela ne fonctionne pas, me donne les mêmes erreurs qu'avant
Kristoffer
3
À titre d'exemple grep -i dfv -- -myfile1 -myfile2,.
ça marche! Merci! faites-en une réponse et je peux le marquer comme accepté pour les générations futures :)
Kristoffer
@AliNa, l'utilisation de guillemets vous a-t-elle aidé spécifiquement avec pdfgrep? Ça n'a pas marché pour moi. J'utilise Lubuntu.
4
@AliNa: Les guillemets ne fonctionneront pas, car ils sont interprétés par le shell, pas par le programme.
hammar

Réponses:

22

Très fréquemment --est utilisé sur la ligne de commande pour signaler à un programme qu'aucun commutateur de commande plus disponible ne sera utilisé. Ceci est particulièrement utile si un fichier contient un tiret, que le programme essaiera d'interpréter comme une option.

  1. Sans le --, une erreur est générée:

    $ 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. Avec le --utilisé, nous avons une commande réussie:

    $ 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 programmé pour comprendre --que les arguments de ligne de commande suivants ne sont pas des options. La plupart des programmes font de même, mais tous ne comprennent pas-- . Pour les programmes qui ne le font pas, la solution consiste à ajouter le nom de fichier avec ./, comme ceci:

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

    Cela devrait fonctionner avec n'importe quelle commande, sauf si, pour une raison quelconque, la commande ne peut pas accepter un chemin, uniquement un nom de fichier pur.

Pour une introduction générale à la ligne de commande, consultez ce PDF utile .

Flimm
la source
4
Malheureusement, --ne fonctionne pas avec tous les programmes en ligne de commande. J'avais supposé d'après ce commentaire du PO que l' pdfgrepun d'entre eux ne le reconnaissait pas --. Mais l'acceptation ici suggère le contraire. Dans tous les cas, un programme doit être codé pour être reconnu --. De nombreux programmes utilisent des bibliothèques pour analyser leurs arguments, qui les reconnaissent --. Mais certains ne le font pas, et parmi ceux-ci, certains ne sont pas codés pour être reconnus --.
Eliah Kagan
3
Pour les programmes qui ne reconnaissent pas --la solution de contournement habituelle, mettez ./en avant le fichier:pdfgrep ./-2013-01-01.pdf
Carlos Campderrós
2
Oui, la mise ./en avant est la solution la plus portable et la plus robuste. Fonctionne sur n'importe quel programme, sur n'importe quelle version Unix.
hlovdal
16

Vous ajoutez le nom de fichier avec ./(ou un autre chemin relatif ou absolu qui fonctionne). De cette façon, il est portable.

Exemple:

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

L'utilisation de --pour indiquer la fin des options n'est pas toujours disponible. Certaines commandes le sauront, d'autres non. Et cela changera à travers différents systèmes. Donc au final, c'est moins portable.

Olivier Dulac
la source