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?


źródło
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
fedorqui
źródło
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
Tidbeck
źródło