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?

linux  bash  shell  unix  mv 

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.