Mv kullanarak unix'deki klasör nasıl taşınır, yalnızca hedef aynı sürücüdeyken


10

Unix mv komutunu kullanarak bir klasörü taşımak gerekir, ancak yalnızca hedef aynı sürücüde veya aynı dosya sisteminde ise. En iyi yaklaşım ne olurdu?

linux  bash  shell  unix  mv 

1
Burada sürücü "cihaz" demek? örneğin aynı sabit disk?
Kent

aynı cihaz, evet

Yanıtlar:


9

Dayanarak iki dizin veya dosya aynı dosya sistemine ait olmadığını kontrol etme ( https://unix.stackexchange.com/ ):

Linux'taki bir kabuk komut dosyasında stat ile yapılabilir :

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

Böylece yapabilirsiniz:

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

ve sonra karşılaştırın.

Ayrıca şöyle yazabilirsiniz:

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

Diğer seçenek. Stackexchange sorusundan da alınmıştır :

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

Linux dağıtımlarında uyumlu olduğunu düşünüyor musunuz?

Sadece daha iyi bir uygulamayı yaymak için kullanmak $(...)yerine `...`. Daha sonra birincinin lehine itiraz edilir.
Shahbaz

Teşekkürler @Shahbaz, sadece tavsiyenizle düzenlediniz!
fedorqui

@zapp Bilmiyorum, test etmeliyim. Deneyimlerim statbana bunun bazen en azından SunOS ile ilgili zor olduğunu söylüyor. Ama Linux olarak umarım uyumludur. Benim Ubuntu 12 ile sorun yok.
fedorqui

Bu %d, farklı dirs için farklı değerler (hatta aynı bölüm) verir /ve/tmp
Kent

2

Bu muhtemelen en temiz çözüm değildir, ancak sürücüler arasında sabit bağlantılar oluşturulamaması gerçeğini kullanabilirsiniz.

ln /path1/file /path2/file 2> /dev/null
if [[ $? == 0 ]]
then
    rm /path1/file
fi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.