GNUツールとを使用するとrsync
、次のことができます。
export LC_ALL=C # force tools to regard those file paths as arrays
# of bytes (as they are in effect) and not do fancy
# sorting (and use English for error/warning messages
# as an undesired side effect).
find . -type f -printf '%T@/%s/%p\0' | # print mtime/size/path
sort -zn | # numerical sort, oldest first
awk -v RS='\0' -v ORS='\0' -F / -v max=50e12 '
{total_size += $2}
total_size > max {exit}
{
sub("^[^/]*/[^/]*/", "") # remove mtime/size/
print # path
}' |
rsync -nv -aHAX0 --files-from=- --remove-source-files . /dest/dir/
(テストされてい-n
ません。これは予行演習用です。幸せなら削除してください)
ファイルサイズに基づいて累積ファイルサイズを計算していることに注意してください(%s
、%b
セクターでのディスク使用量をに置き換え(およびに変更total_size += $2 * 512
)し、ハードリンクを無視します。これらのファイルは、ターゲットファイルシステムにコピーされると、ディレクトリとともにそれらを含むファイルは、おそらく50TB以上を使用することになります(ファイルシステムの圧縮または重複排除が機能している場合を除く)。
total_size > max { exit 0 }
awkスクリプトにa を追加したとしても、より良い答えの答え