Comment déplacer un dossier sous Unix à l'aide de MV, uniquement lorsque la cible se trouve sur le même lecteur

10

J'ai besoin de déplacer un dossier à l'aide de la commande mv unix, mais uniquement si la cible se trouve dans le même lecteur ou le même système de fichiers. Quelle serait la meilleure approche?


la source
1
conduisez ici, vous voulez dire "appareil"? par exemple le même disque dur?
Kent
même appareil, oui

Réponses:

9

Basé sur Comment vérifier si deux répertoires ou fichiers appartiennent au même système de fichiers ( /unix// ):

Dans un script shell sous Linux, cela peut être fait avec stat :

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

Afin que vous puissiez:

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

puis comparer.

Vous pouvez également écrire comme ceci:

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

Autre option. Tiré également de la question Stackexchange :

if [[ $(df -P /path/file1 | tail -1) = $(df -P /path/file2 | tail -1) ]]
then
    # echo "same filesystem"
    # mv sentence
fi
fedorqui
la source
Pensez-vous qu'il est compatible entre les distributions Linux?
Juste pour diffuser la meilleure pratique, utilisez $(...)plutôt `...`. Ce dernier est déconseillé au profit du premier.
Shahbaz
Merci @Shahbaz, venez de le modifier avec votre recommandation!
fedorqui
@zapp Je ne sais pas, devrait le tester. Mon expérience avec statme dit que c'est parfois délicat, au moins avec SunOS. Mais étant Linux j'espère qu'il est compatible. Avec mon Ubuntu 12, ça va.
fedorqui
cela %dgénère des valeurs différentes pour différents répertoires (même partition) essayez avec votre /et/tmp
Kent
2

Ce n'est probablement pas la solution la plus propre, mais vous pouvez utiliser le fait que des liens durs ne peuvent pas être créés entre les disques.

ln /path1/file /path2/file 2> /dev/null
if [[ $? == 0 ]]
then
    rm /path1/file
fi
tidbeck
la source