Как переместить каталог, файл за файлом? (вместо «копировать, а затем удалить»)

20

Мой компьютер имеет один диск 500 ГБ.

Я хочу переместить 400 ГБ данных из /unencryptedв /encrypted.

Оба каталога находятся в одном разделе, но /encryptedобрабатываются ecryptfs , поэтому mv /uncrypted/* /encrypted:

  1. Скопируйте все файлы в место назначения
  2. Затем удалите их из источника

... что я не могу себе позволить, потому что это требует 800 ГБ.
Если файлы были перемещены один за другим, проблем не было бы (зона ecryptfs является динамической).

Есть ли mvопция или другой инструмент, который перемещает каталог файл за файлом?
Существует огромное количество файлов, поэтому ARG_MAX может быть проблемой для решений на основе сценариев.

Николас Рауль
источник

Ответы:

20

Если у вас есть rsync(удалите, --dry-runчтобы сделать это по-настоящему):

rsync --dry-run --remove-source-files -avHAX /unencrypted/ /encrypted

В противном случае, используя bash4 + и GNU stat:

#!/bin/bash

set -e

shopt -s nullglob globstar

for from in /unencrypted/**/*; do
    to="${from/\/un//}"
    if [[ -d "$from" ]]; then
        echo mkdir -p "$to"
        echo chmod "$(stat -c %a "$from")" "$to"
        echo chown "$(stat -c %u:%g "$from")" "$to"
    else
        echo cp -a "$from" "$to" && echo rm "$from"
    fi
done

echo rm -r /unencrypted

Чтобы запустить его по-настоящему, удалите echoиз каждой команды.

Крис Даун
источник
Я люблю идею Rsync! Очевидно, что файлы действительно удаляются по мере их перемещения: superuser.com/questions/405761
Николас Рауль
@NicolasRaoul Если я правильно помню, удаления буферизуются, но это близко к копированию / удалению один к одному.
Крис Даун
Куски - это хорошо для меня, если вес каждого куска меньше 50 ГБ.
Николас Рауль
Разве вам не нужно удалять --dry-runиз командной строки rsync тоже?
CVn
1
@meduz vявляется необязательным и просто печатает имена файлов по мере их передачи. aHAXтребуется хранить все возможные атрибуты файла - aэто архив, HAXэто «хранить жесткие ссылки, списки ACL и расширенные атрибуты».
Крис Даун