No está completamente claro para mí, pero ¿cuál es la diferencia entre mv
y rename
(desde util-linux-ng 2.17.2
as /usr/bin/rename
)? ¿Hay ventajas de uno sobre el otro más allá de rename
aceptar expresiones regulares y mv
no? Creo que rename
también puede manejar varios nombres de archivos a la vez, mientras mv
que no lo hace.
No pude encontrar una indicación clara en sus man
páginas sobre qué más los distingue o mediante alguna investigación por mi cuenta.
type -a rename
yrename --version
?rename is /usr/bin/rename
yrename (util-linux-ng 2.17.2)
respectivamente.rename
puede significar cosas diferentes en diferentes distribuciones.Respuestas:
Es básicamente lo que dice en la tapa, para ambos.
mv
es 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,mv
solo funciona si el destino es el directorio y mueve los archivos allí.Por
mv foo bar
lo tanto, moverá el archivofoo
al directoriobar
(si existe) o cambiará el nombrefoo
abar
(sibar
no existe o no es un directorio).mv foo1 foo2 bar
solo moverá ambos archivos al directoriobar
, o se quejará sibar
no es un directorio.mv
llamará 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
mv
y 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
rename
utilidades renombran archivos, individualmente.El
rename
de util-linux que menciona hace una simple sustitución de cadena, por ejemplorename foo bar *
, cambiaríafoobar
abarbar
, yasdffoo
aasdfbar
. 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
rename
que 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.ul
es y será para la versión util-linux, y no para ninguna de las otras.man rename
lo 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.mv
simplemente 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.rename
se usa para hacer cambios de nombres masivos. Supongamos que tenía un millar de archivos,foo000.log
a travésfoo999.log
y usted quiere cambiar abar000.log
a travésbar999.log
. Conmv
que lo tienes que hacermv foo000.log bar000.log
,mv foo001 bar001.log
etc., o bien escribir un guión. ¡Conrename
solo hacerlorename foo bar foo*.log
, y listo, se cambian mil archivos en un instante! Muy genial. Echa un vistazo a laman rename
pá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)
Hay otras herramientas con el mismo nombre que pueden o no ser capaces de hacer esto, así que tenga cuidado.
Cuando la gente habla
rename
, pensamos en este, no en elELF
menos 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
sprintf
ing 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