Unix: archivos que comienzan con un guión, -

19

Ok, tengo un montón de archivos que comienzan con un guión, -. Lo que no es tan bueno ... y quiero cambiarles el nombre. En mi caso particular, me gustaría poner un personaje delante de ellos.

Encontré la siguiente línea que debería funcionar, pero debido a su guión no funciona:

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

Si pongo un echofrente del mvme sale un montón de

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

Lo cual es correcto, excepto que, por supuesto, pensará que el primer nombre de archivo es opciones. Entonces, cuando elimino echoy lo ejecuto, obtengo un montón de

mv: illegal option -- N

He tratado de cambiarlo a

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

pero las citas simplemente se ignoran al parecer. Intenté usar comillas simples, pero luego la variable no se expandió ... ¿Qué hago aquí?

Actualización: ahora también he intentado citar las citas. Me gusta esto:

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

Y cuando hago eco de eso, parece correcto, pero cuando lo ejecuto, simplemente obtengo

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

No tengo ni idea de cómo hacer esto ahora ... suspiro

Svish
fuente

Respuestas:

28

Debe usar la palabra clave --para indicarle al comando mv que los argumentos no deben interpretarse como opciones. Reloj:

$ 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

Use -- después de todas las opciones en la línea de comandos. Por ejemplo, si está tratando de usar la -iopción para mv , iría antes -- :

mv -i -- -filename-begins-with-dash newfilename
quijote curandero
fuente
66
Aaah No pensé en eso en absoluto. Mientras tanto, descubrí que también podía ponerme ./delante del nombre del archivo, lo que funcionaría. Pero esta es, por supuesto, una opción aún más
ordenada
@Svish: eso es justo, tampoco pensé en anteponer el nombre de archivo ./. pero tienes razón, eso también funciona para esta situación.
quack quijote
77
Tenga en cuenta que el --significado no procesa más argumentos ya que las opciones son una convención y no todos los programas lo respetan. Algunos usan un solitario -para eso, y otros no aceptan nada para ese propósito. Por lo tanto, ./vale la pena tener en cuenta anteponer.
dmckee
@dmckee tiene razón; --como argumento especial es una extensión GNU, pero se menciona en las pautas POSIX. consulte la sección 12.2, directriz 10: opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ... esto significa que puede esperar que la mayoría de las utilidades POSIX y GNU respeten la convención, pero otras no.
quack quijote
6

Otra técnica es incluir el directorio padre con el nombre del archivo ...

Para cambiar el nombre del archivo '-file-to-rename' a 'file-to-rename' ...

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

Gracias @Skippy le Grand Gourou. Confirmó que ./-file-to-rename funciona con mvy rmcomo en ...

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

rm  ./-file-to-rename
DocSalvager
fuente
1
O mejor, como ya se mencionó en los comentarios para graznar la respuesta del quijote, usando ./.
Skippy le Grand Gourou