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?

linux  bash  shell  unix  mv 

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.