Come spostare la cartella in unix usando mv, solo quando target è sulla stessa unità


10

Devo spostare una cartella usando il comando mv unix, ma solo se la destinazione è nella stessa unità o nello stesso filesystem. Quale sarebbe l'approccio migliore?

linux  bash  shell  unix  mv 

1
guidare qui intendi "dispositivo"? ad esempio lo stesso disco rigido?
Kent,

stesso dispositivo, sì

Risposte:


9

Basato su Come verificare se due directory o file appartengono allo stesso filesystem ( https://unix.stackexchange.com/ ):

In uno script shell su Linux può essere fatto con stat :

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

Così puoi:

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

e quindi confrontare.

Puoi anche scrivere così:

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

Altra opzione Tratto anche dalla domanda StackExchange :

if [[ $(df -P /path/file1 | tail -1) = $(df -P /path/file2 | tail -1) ]]
then
    # echo "same filesystem"
    # mv sentence
fi

Pensi che sia compatibile tra le distribuzioni di Linux?

Solo per diffondere la migliore pratica, utilizzare $(...)invece di `...`. Il successivo è deprecato a favore del primo.
Shahbaz,

Grazie @Shahbaz, l'ho appena modificato con il tuo consiglio!
fedorqui,

@zapp Non lo so, dovrebbe provarlo. La mia esperienza con statmi dice che a volte è complicata, almeno con SunOS. Ma essendo Linux spero che sia compatibile. Con il mio Ubuntu 12 va bene.
fedorqui,

questo %demette valori diversi per directory diverse (anche la stessa partizione) prova con il tuo /e/tmp
Kent

2

Questa probabilmente non è la soluzione più pulita, ma potresti usare il fatto che non è possibile creare collegamenti fisici tra le unità.

ln /path1/file /path2/file 2> /dev/null
if [[ $? == 0 ]]
then
    rm /path1/file
fi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.