web-dev-qa-db-ja.com

ディレクトリをファイルごとに移動する方法は? (「コピーしてから削除」の代わりに)

私のコンピューターには500GBのドライブが1つあります。

400GBのデータを/unencryptedから/encryptedに移動したい。

両方のディレクトリは同じパーティションにありますが、/encryptedecryptfs によって処理されるため、mv /uncrypted/* /encryptedは次のようになります。

  1. すべてのファイルを宛先にコピーします
  2. 次に、それらをソースから削除します

... 800GBが必要なため、余裕がありません。
ファイルを1つずつ移動した場合、問題はありません(ecryptfsゾーンは動的です)。

ディレクトリをファイルごとに移動するmvオプションまたは別のツールはありますか?
ファイルの数が非常に多いため、ARG_MAXはスクリプトベースのソリューションでは問題になる可能性があります。

20
Nicolas Raoul

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を削除します。

20
Chris Down