Як переміщувати папку в unix за допомогою mv, лише коли ціль знаходиться на одному диску


10

Мені потрібно перемістити папку, використовуючи команду unix mv, але тільки якщо ціль знаходиться на одному диску або тій же файловій системі. Який був би найкращий підхід?

linux  bash  shell  unix  mv 

1
сюди ви маєте на увазі "пристрій"? наприклад, той же жорсткий диск?
Кент

той самий пристрій, так

Відповіді:


9

На основі того, як перевірити, чи належать два каталоги або файли до однієї файлової системи ( https://unix.stackexchange.com/ ):

У скрипті оболонки в Linux це можна зробити за допомогою stat :

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

Отже ви можете:

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

а потім порівняти.

Ви також можете написати так:

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

Інший варіант. Також взято з питання Stackexchange :

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

Як ви вважаєте, він сумісний у дистрибутивах Linux?

Просто для поширення кращої практики використовуйте $(...)замість цього `...`. Пізніший застарілий на користь першого.
Шахбаз

Дякую @Shahbaz, щойно відредагував це за своєю рекомендацією!
fedorqui

@zapp Я не знаю, повинен це перевірити. Мій досвід роботи statговорить про те, що іноді складно, принаймні, з SunOS. Але будучи Linux, я сподіваюся, що він сумісний. З моїм Ubuntu 12 це добре.
fedorqui

це %dвиводить різні значення для різних dirs (навіть одна і та ж перегородка) спробуйте зі своїм /і/tmp
Кент,

2

Це, мабуть, не найчистіше рішення, але ви можете використовувати той факт, що жорсткі посилання неможливо створити між дисками.

ln /path1/file /path2/file 2> /dev/null
if [[ $? == 0 ]]
then
    rm /path1/file
fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.