'mv' equivalente a arrastrar y soltar con reemplazar?

19

En un entorno GUI, arrastrar y soltar con reemplazar reemplazará los archivos y directorios completos (incluidos los contenidos) con lo que se esté copiando. ¿Hay alguna manera de lograr este mismo resultado intuitivo con el comando 'mv'?

usuario7089
fuente

Respuestas:

20

No con mv.

La función principal de mv(a pesar de su nombre) es renombrar un objeto. Una de las garantías que ofrece UNIX es que los cambios de nombre son atómicos: nunca se le permite ver un cambio de nombre parcialmente completado. Esta garantía puede ser muy útil si desea cambiar un archivo ( /etc/passwdpor ejemplo) que otros programas pueden estar mirando y desea que vean la versión antigua o nueva del archivo, y no hay otra posibilidad . Pero un "cambio de nombre recursivo" como el que usted describe rompería esa garantía: podría detenerlo en el medio y tendría un árbol a medio mover y probablemente un desastre, por lo que realmente no encaja con la filosofía de mv. Esa es mi suposición de por qué mv -rno existe.

(No importa que los mvdescansos que la filosofía de otras maneras, más pequeñas. Por ejemplo, mven realidad hace un cpseguido de rmal mover archivos de un sistema de archivos a otro.)

Suficiente filosofía Si desea mover recursivamente ("arrastrar y soltar") un árbol de un lugar a otro en el mismo sistema de archivos , puede obtener la eficiencia y la velocidad de la mvsiguiente manera (por ejemplo):

cp -al source/* dest/ && rm -r source/*

La -lmarca para cpsignifica "crear un enlace duro en lugar de copiar": está creando efectivamente un nuevo nombre de archivo que apunta a los mismos datos de archivo que el nombre de archivo anterior. Sin embargo, esto solo funciona en sistemas de archivos que admiten enlaces duros, por lo que cualquier sistema de archivos UNIX-ish nativo está bien, pero no funcionará con FAT.

El &&medio "solo ejecuta el siguiente comando si el comando anterior tuvo éxito". Si lo desea, puede ejecutar los dos comandos uno a la vez.

Jander
fuente
Extremadamente informativo. ¡Muchas gracias!
user7089
4

No creo que pueda replicar el comportamiento de arrastrar y soltar con el que está describiendo mv, ya que los subdirectorios no vacíos en el objetivo no serán reemplazados.

Tal vez rsync? Algo como rsync -a -r source/ target/? Ejecute -v -nprimero para hacer una ejecución en seco detallada para asegurarse de que hace lo que desea.

cjc
fuente
3

mv -f /path/to/source/folder/* /destination/folder/

Moverá todo en / ruta / a / fuente / carpeta, incluidos los archivos y directorios a / destino / carpeta.

Y sobrescribirá los archivos y directorios existentes.

Tim
fuente
2
Solo directorios vacíos
Kevin
1

Probablemente quieras cambiar la respuesta correcta a esto:

https://github.com/iaindooley/pickdrop

Ejemplo:

decir que tengo:

test/
test/index.php
test/images/
test/images/a.jpg
test/images/thing.png

y quiero mover estas cosas a / sitio

entonces se ve así:

site/
site/public/
site/public/index.php
site/public/a.jpg
site/public/thing.png

Puedo ir:

cd images &&
pick a.jpg thing.png
cd .. &&
pick index.php &&
cd .. &&
mkdir site &&
mkdir site/public &&
cd site/public &&
drop

Esto es literalmente cortar y pegar.

ensayador
fuente
Muy guay, y definitivamente vale la pena estudiarlo. Sin embargo, la pregunta era específicamente sobre 'mv', así que creo que dejaré la respuesta correcta como la que explica la filosofía detrás de mv en detalle. Sin embargo, gracias por esta contribución, definitivamente muy útil.
user7089
También es notable, por el archivo Léame: "No es robusto en absoluto: almacena sus selecciones en ~ / .pick hasta que llame a drop, momento en el que usa las rutas de archivo en ~ / .pick para crear un nuevo archivo ejecutable ~ / .drop para copiar cada uno de los archivos que seleccionó en el directorio de trabajo actual ".
user7089