Bash: создать жесткую ссылку, если место назначения находится внутри того же тома, скопировать, если нет - PullRequest
3 голосов
/ 11 января 2012

Мой скрипт bash делает копии некоторых файлов в несколько каталогов.

Чтобы сэкономить место и максимально увеличить скорость, я бы предпочел делать жесткие ссылки вместо копий, поскольку все копии должны оставаться идентичными во время ихВ любом случае, life.

Сценарий запускается на разных компьютерах, и может быть случай, когда каталог назначения существует в томе, отличном от исходного.В таком случае я не могу создать жесткую ссылку и мне нужно просто скопировать файл.

Как проверить, существуют ли каталоги источника и назначения на одном и том же томе, так что я могу либо создать жесткую ссылку, либо скопировать в зависимости от нее

Ответы [ 2 ]

4 голосов
/ 11 января 2012

Простой способ сделать это, просто попробовать оба:

    ln "$FROM" "$TO" || cp "$FROM" "$TO"

В зависимости от ваших целей, создание эталонной копии (которая почти так же легка, как и файл с жесткими ссылками, но позволяет редактировать / расходить две копии в будущем) может работать:

    cp --reflink=auto "$FROM" "$TO"

Но вы можете получить идентификатор устройства файловой системы устройства, используя stat:

    if [ $(stat -c %D "$FROM") = $(stat -c %D "$TARGET_DIR") ]; then
          ln "$FROM" "$TARGET_DIR"/
    else
          cp "$FROM" "$TARGET_DIR"/
    fi
0 голосов
/ 11 января 2012

Простой способ, проверив, не удалось ли ln там, где cp успешно:

ln $SRC $TARGET || cp $SRC $TARGET
...