Cómo mover la carpeta en unix usando mv, solo cuando el destino está en la misma unidad


10

Necesito mover una carpeta usando el comando unix mv, pero solo si el objetivo está en la misma unidad o en el mismo sistema de archivos. ¿Cuál sería el mejor enfoque?

linux  bash  shell  unix  mv 

1
conducir aquí te refieres a "dispositivo"? por ejemplo, ¿el mismo disco duro?
Kent

mismo dispositivo, sí

Respuestas:


9

Basado en Cómo verificar si dos directorios o archivos pertenecen al mismo sistema de archivos ( /unix// ):

En un script de shell en Linux se puede hacer con stat :

stat -c "%d" /path  # returns the decimal device number

Así que puedes:

file1=$(stat -c "%d" /path/file1)
file2=$(stat -c "%d" /path/file2)

y luego comparar.

También puedes escribir así:

if [ $(stat -c "%d" /path/file1) -eq $(stat -c "%d" /path/file1) ]
then
    # mv sentence
fi

Otra opción. También tomado de la pregunta de Stackexchange :

if [[ $(df -P /path/file1 | tail -1) = $(df -P /path/file2 | tail -1) ]]
then
    # echo "same filesystem"
    # mv sentence
fi

¿Crees que es compatible con las distribuciones de Linux?

Solo por difundir la mejor práctica, use en $(...)lugar de `...`. El último está en desuso a favor del primero.
Shahbaz

Gracias @Shahbaz, ¡acabo de editarlo con tu recomendación!
fedorqui

@zapp No lo sé, debería probarlo. Mi experiencia con statme dice que a veces es complicado, al menos con SunOS. Pero siendo Linux espero que sea compatible. Con mi Ubuntu 12 está bien.
fedorqui

esto %dproduce diferentes valores para diferentes directorios (incluso la misma partición) intente con su /y/tmp
Kent

2

Probablemente esta no sea la solución más limpia, pero podría usar el hecho de que no se pueden crear enlaces duros entre unidades.

ln /path1/file /path2/file 2> /dev/null
if [[ $? == 0 ]]
then
    rm /path1/file
fi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.