Unix: fichiers commençant par un tiret, -

19

Ok, j'ai un tas de fichiers commençant par un tiret, -. Ce qui n'est pas si bon ... et je veux les renommer. Dans mon cas particulier, je voudrais juste mettre un personnage devant eux.

J'ai trouvé la ligne suivante qui devrait fonctionner, mais à cause de cela, elle ne fonctionne pas:

for file in -N*.ext; do mv $file x$file; done

Si je mets un echodevant le mvje reçois un tas de

mv -N1.ext x-f1.ext
mv -N2.ext x-f2.ext

Ce qui est correct, sauf que bien sûr, il pensera que le premier nom de fichier est des options. Donc, quand je retire le echoet l'exécute, je reçois juste un tas de

mv: illegal option -- N

J'ai essayé de le changer en

for file in -N*.ext; do mv "$file" "x$file"; done

mais les citations sont simplement ignorées, semble-t-il. J'ai essayé d'utiliser des guillemets simples, mais la variable n'a pas été développée ... Que dois-je faire ici?

Mise à jour: J'ai maintenant également essayé de citer les citations. Comme ça:

for file in -N*.ext; do mv '"'$file'"' '"'x$file'"'; done

Et quand je fais écho, ça a l'air correct, mais quand je le lance, je reçois juste

mv: rename "-N1.ext" to "x-n1.ext":: No such file or directory

Je n'ai aucune idée de comment faire ça maintenant ... soupir

Svish
la source

Réponses:

28

Vous devez utiliser le mot clé --pour indiquer à la commande mv que les arguments ne doivent pas être interprétés comme des options. Regarder:

$ mv -N1.ext x-f1.ext
mv: invalid option -- N
Try `mv --help' for more information.

$ mv -- -N1.ext x-f1.ext
$ ls
x-f1.ext

Utilisez -- après toutes les options de la ligne de commande. Par exemple, si vous essayez d'utiliser l' -ioption mv , cela irait avant -- :

mv -i -- -filename-begins-with-dash newfilename
Quack Quichotte
la source
6
Aaah. Je n'y ai pas pensé du tout. En attendant, j'ai découvert que je pouvais également rester ./devant le nom de fichier, ce qui fonctionnerait. Mais c'est bien sûr une option encore plus soignée :)
Svish
@Svish: c'est juste, je n'ai pas pensé à ajouter le nom de fichier avec ./. mais vous avez raison, cela fonctionne aussi pour cette situation.
Quack Quichotte
7
Notez que la --signification ne traite pas d'autres arguments car les options sont une convention et ne sont pas respectées par tous les programmes. Certains utilisent un seul -pour cela, et certains n'acceptent rien à cette fin. Il ./est donc important de garder à l'esprit la prépension .
dmckee
@dmckee a raison; --comme argument spécial est une extension GNU, mais elle est mentionnée dans les directives POSIX. voir section 12.2, directive 10: opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ... cela signifie que vous pouvez vous attendre à ce que la plupart des utilitaires POSIX et GNU respectent la convention, mais d'autres non.
Quack Quichotte
6

Une autre technique consiste à inclure le répertoire parent avec le nom de fichier ...

Pour renommer le fichier '-file-to-rename' en 'file-to-rename' ...

mv  ../parent-dir/-file-to-rename  file-to-rename

Merci @Skippy le Grand Gourou. Confirmé que ./-file-to-rename fonctionne avec mvet rmcomme dans ...

mv  ./-file-to-rename  ./--file-to-rename

rm  ./-file-to-rename
DocSalvager
la source
1
Ou mieux, comme déjà mentionné dans les commentaires pour quack réponse de Quichotte, en utilisant ./.
Skippy le Grand Gourou