So verschieben Sie Ordner unter Unix mit mv nur, wenn sich das Ziel auf demselben Laufwerk befindet

10

Ich muss einen Ordner mit dem Befehl unix mv verschieben, aber nur, wenn sich das Ziel auf demselben Laufwerk oder demselben Dateisystem befindet. Was wäre der beste Ansatz?


quelle
1
hier fahren meinst du "gerät"? zB gleiche Festplatte?
Kent
gleiches Gerät, ja

Antworten:

9

Basierend auf So überprüfen Sie, ob zwei Verzeichnisse oder Dateien zum selben Dateisystem gehören ( /unix// ):

In einem Shell-Skript unter Linux kann dies mit stat erfolgen :

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

Also kannst du:

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

und dann vergleichen.

Sie können auch so schreiben:

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

Andere Option. Auch aus der Stackexchange-Frage entnommen :

if [[ $(df -P /path/file1 | tail -1) = $(df -P /path/file2 | tail -1) ]]
then
    # echo "same filesystem"
    # mv sentence
fi
fedorqui
quelle
Denken Sie, dass es über Linux-Distributionen kompatibel ist?
Verwenden Sie $(...)statt , um die bessere Praxis zu verbreiten `...`. Letzteres wird zugunsten des ersteren abgelehnt.
Shahbaz
Danke @Shahbaz, habe es gerade mit deiner Empfehlung bearbeitet!
Fedorqui
@zapp Ich weiß nicht, sollte es testen. Meine Erfahrung mit zeigt stat, dass es manchmal schwierig ist, zumindest mit SunOS. Aber als Linux hoffe ich, dass es kompatibel ist. Mit meinem Ubuntu 12 ist es in Ordnung.
Fedorqui
Dies %dgibt verschiedene Werte für verschiedene Verzeichnisse aus (sogar dieselbe Partition). Versuchen Sie es mit Ihrem /und/tmp
Kent
2

Dies ist wahrscheinlich nicht die sauberste Lösung, aber Sie können die Tatsache nutzen, dass keine festen Verbindungen zwischen Laufwerken hergestellt werden können.

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