¿Cuál es la diferencia entre 'rename' y 'mv'?

12

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.

Urda
fuente
2
Asegurémonos de que estamos hablando de las mismas cosas; ¿Cuáles son los resultados de type -a renamey rename --version?
Jeff Schaller
@JeffSchaller Es más una curiosidad de mi parte, pero en una de mis máquinas * nix obtengo rename is /usr/bin/renamey rename (util-linux-ng 2.17.2)respectivamente.
Urda
66
Hay algunos cambios de nombre diferentes , y podría haber sido un alias / función / script, así que solo quería asegurarme de que supiéramos qué era. ¡Gracias! Por favor, siéntase libre de editar esos resultados en su pregunta.
Jeff Schaller
@JeffSchaller no te preocupes, en realidad este enlace fue uno que acabo de encontrar que me mostró que renamepuede significar cosas diferentes en diferentes distribuciones.
Urda
55
Parece que su pregunta contiene su respuesta. "¿Cuál es la diferencia entre un jet y un triciclo, aparte del hecho de que un jet puede volar y puede ir varios miles de veces más rápido?" :-) ⁠
G-Man dice 'Reincorporar a Mónica' el

Respuestas:

21

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 archivo fooal directorio bar(si existe) o cambiará el nombre fooa bar(si barno existe o no es un directorio). mv foo1 foo2 barsolo moverá ambos archivos al directorio bar, o se quejará si barno es un directorio.

mvllamará a la rename()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 ejemplo rename foo bar *, cambiaría foobara barbar, y asdffooa asdfbar. 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 compatibles rename --version, así que úsalos para identificar cuál tienes.

ilkkachu
fuente
No solo 'expresión regular' sino también función si la necesita
Gilles Quenot
@GillesQuenot, bueno, sí, podrías hacerlo, por ejemplo, rename '$_=lc' *a nombres de archivo en minúsculas. Pero creo que el caso más común es el uso s///(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.
ilkkachu
@MyWrathAcademia, ese primer ejemplo en la página del manual me funciona (simplemente hace las cosas de manera diferente a la otra). Además, la razón por la que me vinculé a las páginas de manual de Debian es que al menos allí está muy claro que la página de manual para rename.ules y será para la versión util-linux, y no para ninguna de las otras.
ilkkachu
@ilkkachu, ¿te importaría agregar una explicación a ese primer ejemplo en tu respuesta o en un comentario? Es diferente del ejemplo, por man renamelo que sería bueno saber su comprensión del ejemplo de Debian
MyWrathAcademia
@ MyWrathAcademia, supuse que te referías al rename 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. Usando rename foo foo00 foo?como el primer comando también funciona, solo agrega dos ceros de una vez.
ilkkachu
2

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és foo999.logy usted quiere cambiar a bar000.loga través bar999.log. Con mvque lo tienes que hacer mv foo000.log bar000.log, mv foo001 bar001.logetc., o bien escribir un guión. ¡Con renamesolo hacerlo rename foo bar foo*.log, y listo, se cambian mil archivos en un instante! Muy genial. Echa un vistazo a la man renamepágina nuevamente para más detalles.

eewanco
fuente
2

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 inteligente

renombrar (el de Perl)

advertencia 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 el ELFmenos 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

foobar_1.txt
foobar_2.txt
foobar_3.txt

Puede anteponer ceros a los dígitos de sprintf()esta manera (usando regex, heh, es Perl: D):

rename 's/(\d+)/sprintf("%04d", $1)/e' foobar_*.txt

Ahora tu tienes :

foobar_0001.txt
foobar_0002.txt
foobar_0003.txt

No es realmente un comando básico, ¿no?

no está realmente diseñado para mover directorios , pero puede hacerlo:

$ mkdir -p /tmp/foo/bar/base
$ touch /tmp/foo/bar/base/file
$ rename 's!/tmp/foo/bar/base/file!/tmp/file!' /tmp/foo/bar/base/file

El archivo movido

/tmp/file

¹ algún código que vemos en los *.stackexchange.*sitios web

ingrese la descripción de la imagen aquí

for FILE in `ls *.txt`
do
    mv ${FILE} `echo ${FILE} | sed 's/anything_ugly/anything_still_ugly/'`
done

No es el camino a seguir , es simplemente defectuoso, solo para explicar por qué usar la herramienta correcta en el momento correcto

Gilles Quenot
fuente
+1 por sprintfing con cambio de nombre
Archemar
-1

mv 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)

   --backup[=CONTROL]  
          make a backup of each existing destination file  

   -b     like --backup but does not accept an argument  

   -f, --force  
          do not prompt before overwriting  

   -i, --interactive  
          prompt before overwrite  

   -n, --no-clobber  
          do not overwrite an existing file  

  If you specify more than one of -i, -f, -n, only the final one takes effect.  

   --strip-trailing-slashes  
          remove any trailing slashes from each SOURCE argument  

   -S, --suffix=SUFFIX  
          override the usual backup suffix  

   -t, --target-directory=DIRECTORY  
          move all SOURCE arguments into DIRECTORY  

   -T, --no-target-directory  
          treat DEST as a normal file  

   -u, --update  
          move only when the SOURCE file is newer than the destination file or when the destination file is missing  

   -v, --verbose  
          explain what is being done  

   -Z, --context  
          set SELinux security context of destination file to default type  

opciones de cambio de nombre (omitiendo ayuda y versión)

   -s, --symlink   
          Do not rename a symlink but its target.  

   -v, --verbose  
          Show which files where renamed, if any.  

   -n, --no-act  
          Do not make any changes.  

   -o, --no-overwrite  
          Do not overwrite existing files.            
K7AAY
fuente
3
Definir 'más poderoso'. ¿Mv admite regex como rename?
Gilles Quenot
Como dijo el interrogador, no.
K7AAY
2
Wow, que un argumento
Gilles Quenot
1
Dar crédito donde se debe el crédito.
K7AAY