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?

linux  bash  shell  unix  mv 

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.