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?


fuente
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
fedorqui
fuente
¿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
tidbeck
fuente