No está completamente claro para mí, pero ¿cuál es la diferencia entre mvy rename(desde util-linux-ng 2.17.2as /usr/bin/rename)? ¿Hay ventajas de uno sobre el otro más allá de renameaceptar expresiones regulares y mvno? Creo que renametambién puede manejar varios nombres de archivos a la vez, mientras mvque no lo hace.
No pude encontrar una indicación clara en sus manpáginas sobre qué más los distingue o mediante alguna investigación por mi cuenta.

type -a renameyrename --version?rename is /usr/bin/renameyrename (util-linux-ng 2.17.2)respectivamente.renamepuede significar cosas diferentes en diferentes distribuciones.Respuestas:
Es básicamente lo que dice en la tapa, para ambos.
mves una utilidad estándar para mover uno o más archivos a un objetivo determinado. Se puede usar para cambiar el nombre de un archivo, si solo hay un archivo para mover. Si hay varios,mvsolo funciona si el destino es el directorio y mueve los archivos allí.Por
mv foo barlo tanto, moverá el archivofooal directoriobar(si existe) o cambiará el nombrefooabar(sibarno existe o no es un directorio).mv foo1 foo2 barsolo moverá ambos archivos al directoriobar, o se quejará sibarno es un directorio.mvllamará a larename()función de biblioteca C para mover los archivos, y si eso no funciona (se están moviendo a otro sistema de archivos), copiará los archivos y eliminará los originales.Si todo lo que tiene es
mvy desea cambiar el nombre de varios archivos, deberá usar un bucle de shell. Hay una serie de preguntas sobre eso aquí en el sitio, ver por ejemplo este , este , y otros .Por otro lado, las diversas
renameutilidades renombran archivos, individualmente.El
renamede util-linux que menciona hace una simple sustitución de cadena, por ejemplorename foo bar *, cambiaríafoobarabarbar, yasdffooaasdfbar. No , no , sin embargo, toma una expresión regular!La utilidad de cambio de nombre de Perl ( o varias instancias de la misma ) toma una expresión de Perl para transformar los nombres de archivo. Lo más probable es que use un comando, donde el patrón es una expresión regular.
s/pattern/replacement/Tanto el cambio de nombre de util-linux como el cambio de nombre de Perl se pueden usar para mover archivos a otro directorio al mismo tiempo, haciendo los cambios apropiados al nombre del archivo, pero es un poco incómodo. Tampoco hace más que invocar
rename()los archivos, por lo que no funciona pasar de un sistema de archivos a otro.En cuanto a lo
renameque tiene, puede depender de su distribución y / o de lo que haya instalado. La mayoría de ellos son compatiblesrename --version, así que úsalos para identificar cuál tienes.fuente
rename '$_=lc' *a nombres de archivo en minúsculas. Pero creo que el caso más común es el usos///(que mencioné) y la parte del patrón es una expresión regular; No creo que puedas usar una función allí. Sin embargo, podría hacerlo en la parte de reemplazo.rename.ules y será para la versión util-linux, y no para ninguna de las otras.man renamelo que sería bueno saber su comprensión del ejemplo de Debianrename foo foo0 foo?; rename foo foo0 foo??ejemplo, ya que esa era la única diferencia entre esas dos páginas de manual que vi. Ese par de comandos funciona porque el primero agrega un cero a los nombres de cada nombre de archivo de un solo dígito, y después de eso, el segundo agrega (otro) cero a cada nombre de archivo de dos dígitos. Ese segundo conjunto incluye los archivos renombrados por el primer comando. Usandorename foo foo00 foo?como el primer comando también funciona, solo agrega dos ceros de una vez.mvsimplemente cambia el nombre del archivo (también puede moverlo a otro sistema de archivos o ruta). Le da un nombre antiguo y un nombre nuevo, y cambia el archivo al nuevo nombre o ubicación.renamese usa para hacer cambios de nombres masivos. Supongamos que tenía un millar de archivos,foo000.loga travésfoo999.logy usted quiere cambiar abar000.loga travésbar999.log. Conmvque lo tienes que hacermv foo000.log bar000.log,mv foo001 bar001.logetc., o bien escribir un guión. ¡Conrenamesolo hacerlorename foo bar foo*.log, y listo, se cambian mil archivos en un instante! Muy genial. Echa un vistazo a laman renamepágina nuevamente para más detalles.fuente
mv
Es una línea de comando básica diseñada para hacer una cosa y hacerlo bien (filosofía de Unix): mover archivo (s) o director (es) .
Puede hackear
STDOUT&STDIN¹ para modificar sobre la marcha la cadena de destino, pero no es un hack inteligenterenombrar (el de Perl)
Cuando la gente habla
rename, pensamos en este, no en elELFmenos poderoso (¿magia?).No es básico, es Perl. Puede pasar algunas funciones de Perl adentro, y es extremadamente poderoso.
Considere este ejemplo:
Desea cambiar el nombre de un montón de archivos como
Puede anteponer ceros a los dígitos de
sprintf()esta manera (usando regex, heh, es Perl: D):Ahora tu tienes :
No es realmente un comando básico, ¿no?
rename no está realmente diseñado para mover directorios , pero puede hacerlo:
El archivo movido
¹ algún código que vemos en los
*.stackexchange.*sitios webNo es el camino a seguir , es simplemente defectuoso, solo para explicar por qué usar la herramienta correcta en el momento correcto
fuente
sprintfing con cambio de nombremv mueve o renombra archivos y directorios y los respaldará; renombrar solo renombra archivos.
mv tiene más capacidades y opciones. Mire los interruptores en las páginas del manual para ver las diferencias en las capacidades. Echemos un vistazo usando man en Ubuntu 18.04LTS (su kilometraje puede variar según la versión de cada paquete):
opciones de mv (omitiendo ayuda y versión)
opciones de cambio de nombre (omitiendo ayuda y versión)
fuente