90TBから50TBの範囲のファイルシステムで、最も古いファイルと関連ディレクトリを見つけて別のファイルシステムに移動する必要があります。ディレクトリ構造はファイルの内容を識別するため、ディレクトリ構造を保存する必要があります。だから -
1級/2級/3級/(文書)
構造です。構造全体を移動する必要があります。最上位ディレクトリには何もありませんが、私が探しているすべてのファイルの名前が同じであるため、そのファイルがないとファイルが何に属しているかを識別できません。プロセスが完了したら、元のファイルシステムに約40 TBを残し、新しいファイルシステムにはほとんど何も残さないはずです。これは、元のファイルシステムで最も古いファイルがそこにあるためです。
ありがとうございます!
答え1
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以上を使用できます。
答え2
"ls"コマンドはタイムスタンプを使用して少しクリエイティブなので、それを解析するのは難しいかもしれません。これを実装する言語で実装する方がはるかに簡単かもしれません。統計資料()。一部のUnixバージョンではコマンドライン統計- 近くのRHボックスから:
find ${BASEDIR} -type f -exec stat --format="%y %b %n" {} \; | sort | less
しかし、これは多くのファイルを持つ犬のように実行されます。
GNU awkのドキュメントには以下が含まれます。拡張例ファイルシステム機能は提供されていますが、それを構築して維持するにはいくつかの作業を行う必要があります。
PHP、C、Perl(またはGo、Ruby、または他の多くの言語)を使用して最初からプログラムを書くのは簡単ですが、この記事の範囲を超えています。