Как переместить папку в Unix с помощью mv, только когда цель находится на том же диске

10

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


источник
1
диск здесь ты имеешь ввиду "устройство"? например такой же жесткий диск?
Кент,
то же устройство, да

Ответы:

9

На основе Как проверить, принадлежат ли два каталога или файла к одной файловой системе ( /unix// ):

В сценарии оболочки в 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
fedorqui
источник
Как вы думаете, он совместим с дистрибутивами Linux?
Просто для распространения лучшей практики используйте $(...)вместо `...`. Последнее не рекомендуется в пользу первого.
Шахбаз
Спасибо @Shahbaz, только что отредактировал его по вашей рекомендации!
Федорки
@zapp Я не знаю, должен проверить это. Мой опыт работы с statговорит мне, что это иногда сложно, по крайней мере с SunOS. Но, будучи Linux, я надеюсь, что он совместим. С моей Ubuntu 12 все нормально.
Федорки
это %dвыводит разные значения для разных директорий (даже для одного раздела) попробуйте с вашим /и/tmp
Кент
2

Вероятно, это не самое чистое решение, но вы могли бы использовать тот факт, что жесткие связи не могут быть созданы между дисками.

ln /path1/file /path2/file 2> /dev/null
if [[ $? == 0 ]]
then
    rm /path1/file
fi
tidbeck
источник