web-dev-qa-db-fra.com

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

C'est 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 pdfgrep sur un fichier nommé -2013-01-01.pdf mais il se plaint qu'aucune option ne soit définie pour 2, 0, 1, 3, etc.

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 est à venir.

20
Kristoffer

Très souvent, -- est utilisé sur la ligne de commande pour signaler à un programme que plus aucun commutateur de commande 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. pdfgrep est programmé pour comprendre -- signifie que les arguments de ligne de commande suivants ne sont pas des options. La plupart des programmes font la même chose, mais tous les programmes 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, à moins que pour une raison quelconque, la commande ne puisse pas accepter un chemin, seulement un nom de fichier pur.

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

22
user76204

Vous ajoutez le nom de fichier avec ./ (ou un autre chemin relatif ou absolu qui fonctionne). De cette façon, c'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 va changer à travers différents systèmes. Donc au final, c'est moins portable.

16
Olivier Dulac