Cara memindahkan folder di unix menggunakan mv, hanya ketika target ada di drive yang sama

10

Saya perlu memindahkan folder menggunakan perintah unix mv, tetapi hanya jika targetnya ada di drive yang sama atau sistem file yang sama. Apa yang akan menjadi pendekatan terbaik?


sumber
1
mengemudi di sini maksudmu "perangkat"? misalnya harddisk yang sama?
Kent
perangkat yang sama, ya

Jawaban:

9

Berdasarkan Cara memeriksa apakah dua direktori atau file milik sistem file yang sama ( /unix// ):

Dalam skrip shell di Linux dapat dilakukan dengan stat :

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

Jadi kamu bisa:

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

dan kemudian membandingkan.

Anda juga dapat menulis seperti ini:

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

Pilihan lain. Juga diambil dari pertanyaan Stackexchange :

if [[ $(df -P /path/file1 | tail -1) = $(df -P /path/file2 | tail -1) ]]
then
    # echo "same filesystem"
    # mv sentence
fi
fedorqui
sumber
Apakah Anda pikir itu kompatibel di seluruh distribusi linux?
Hanya untuk menyebarkan praktik yang lebih baik, gunakan $(...)saja `...`. Yang kemudian ditinggalkan demi yang pertama.
Shahbaz
Terima kasih @ Shahbaz, baru diedit dengan rekomendasi Anda!
fedorqui
@ zapp Saya tidak tahu, harus mengujinya. Pengalaman saya dengan statmengatakan bahwa kadang-kadang sulit, setidaknya dengan SunOS. Tetapi sebagai Linux saya harap ini kompatibel. Dengan Ubuntu 12 saya baik-baik saja.
fedorqui
ini %dmenghasilkan nilai yang berbeda untuk dir yang berbeda (bahkan partisi yang sama) coba dengan /dan/tmp
Kent
2

Ini mungkin bukan solusi terbersih, tetapi Anda dapat menggunakan fakta bahwa tautan keras tidak dapat dibuat antar drive.

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