Jak przenieść folder w unixie przy użyciu mv, tylko gdy cel znajduje się na tym samym dysku


10

Muszę przenieść folder za pomocą polecenia univ mv, ale tylko wtedy, gdy obiekt docelowy znajduje się na tym samym dysku lub w tym samym systemie plików. Jakie byłoby najlepsze podejście?

linux  bash  shell  unix  mv 

1
jeździć tutaj masz na myśli „urządzenie”? np. ten sam dysk twardy?
Kent

to samo urządzenie, tak

Odpowiedzi:


9

Na podstawie tego, jak sprawdzić, czy dwa katalogi lub pliki należą do tego samego systemu plików ( https://unix.stackexchange.com/ ):

W skrypcie powłoki w systemie Linux można to zrobić za pomocą stat :

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

Więc możesz:

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

a następnie porównaj.

Możesz także napisać w ten sposób:

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

Inna opcja. Również wzięty z pytania Stackexchange :

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

Myślisz, że jest kompatybilny z wszystkimi dystrybucjami Linuksa?

Aby rozpowszechnić lepszą praktykę, użyj $(...)zamiast `...`. Ten drugi jest przestarzały na rzecz tego pierwszego.
Shahbaz

Dzięki @Shahbaz, właśnie edytowałem to z twoją rekomendacją!
fedorqui

@zapp Nie wiem, powinienem to przetestować. Z moich doświadczeń statwynika, że ​​czasem jest to trudne, przynajmniej z SunOS. Ale jako Linux mam nadzieję, że jest kompatybilny. Z moim Ubuntu 12 jest w porządku.
fedorqui

to %ddaje różne wartości dla różnych katalogów (nawet ta sama partycja) spróbuj z twoim /i/tmp
Kent 29'13

2

Nie jest to prawdopodobnie najczystsze rozwiązanie, ale można skorzystać z faktu, że nie można utworzyć twardych łączy między dyskami.

ln /path1/file /path2/file 2> /dev/null
if [[ $? == 0 ]]
then
    rm /path1/file
fi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.