Impossible de renommer un fichier dont le nom commence par un tiret

37

J'essaie de renommer un fichier avec un trait d'union au début de son nom et les deux ceci:

mv -example-file-name example-file-name

et ça:

mv '-example-file-name' example-file-name

aboutir à:

mv: invalid option -- 'e'
Desmond Hume
la source
1
Utilisez le chemin relatif du fichier (./tmp/-example), le chemin complet (/ home / a / tmp / -example) ou dites à mv que vous avez fini de donner des options avec - et que ce qui suit est fichier noms.
Ярослав Рахматуллин
Au cas où quelqu'un se demanderait: mv *example-file-name example-file-namea le même problème, car l'expansion du nom de fichier (globalisation AKA) se produit avant l' mvappel.
Walter Tross

Réponses:

53

La plupart des commandes GNU / Linux permettent à une --option d'indiquer la fin des options afin que les -mots préfixés suivants ne soient pas traités comme des options.

  mv -- -example-file-name example-file-name

Un petit test

$ touch -- -example
$ ls -l -- *ample
-rw-r--r-- 1 rgb rgb 0 Nov 25 09:57 -example
$ mv -- -example example
$
RedGrittyBrick
la source
Cela résout également le même problème rename. (au moins la version qui fonctionne rename [options] <expression> <replacement> <file>..., quelle qu'elle soit.)
underscore_d
Merde, BSD / Mac OS X mvn'a pas ça :(
Sridhar Sarnobat
18

La réponse de RedGrittyBrick est très bonne. Une autre option est:

mv ./-example-file-name example-file-name

Un petit test:

$ touch ./-example
$ ls -l ./*ample
-rw-r--r-- 1 me me 0 Nov 25 16:02 ./-example
$ mv ./-example example
$ ls -l ./*ample
-rw-r--r-- 1 me me 0 Nov 25 16:02 ./example
gniourf_gniourf
la source
très belle solution de contournement, cela ne m'est jamais venu à l'esprit. Et contrairement à la réponse acceptée, cela fonctionnera sur BSD / Mac OS X
Sridhar Sarnobat
C'est un peu plus accrocheur que --.
Corni
-1

Vous pouvez utiliser ceci:

rename -- "s/\-//g" *

qu'il peut renommer tous les fichiers :) si votre nom de fichier:

-ng--sh-ay-01[------------]-FLV

après l'exécution du code, votre nom de fichier devient:

ngshay01[]FLV
k-cinq
la source
1
Les autres approches (celle de RedGrittyBrick et gniourf_gniourf) sont plus susceptibles de fonctionner avec plusieurs autres commandes.
TOOGAM
-1

Cette astuce fonctionne pour moi en période de désespoir. YMMV

rename \- '' *

Vous devez échapper le trait d'union pour le renommer pour le reconnaître. Pourquoi le changement de nom ne respecte pas les guillemets simples ou n'offre pas une dérogation quelconque

C'est la seule méthode que j'ai vue qui gère de manière fiable un trait d'union en utilisant renommer. Je suis d'accord avec les autres articles sur l'utilisation de mv, mais si vous ne pouvez pas utiliser mv pour une raison quelconque, cela fonctionne.

Alex Z
la source