最大50 TBのファイルシステムで最も古いファイル/ディレクトリを検索


8

90 TBのファイルシステムから最大50 TBの最も古いファイルと関連するディレクトリを見つけて、それらを別のファイルシステムに移動する必要があります。ファイルが何であるかを識別するため、ディレクトリ構造を保持する必要があります。そう -

第1レベル/第2レベル/第3レベル/(ファイル)

構造です。その構造全体を移動する必要があります。トップレベルのディレクトリには何もありませんが、それらがないと、探しているすべてのファイルが同じ名前であるため、ファイルが属しているファイルを特定できません。プロセスが完了すると、元のファイルシステムに約40 TBが残り、新しいファイルシステムにはほとんど何も残っていないはずです。これは、元の最も古いファイルが残っているためです。

ありがとう!

回答:


9

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以上を使用することになります(ファイルシステムの圧縮または重複排除が機能している場合を除く)。


1
私よりtotal_size > max { exit 0 }awkスクリプトにa を追加したとしても、より良い答えの答え
symcbean

@symcbean、良い点!今追加しました。ありがとう。
ステファンChazelas

いいね!ただし、1つの質問-awkステートメントの「max = 50e12」の部分がシステムに50 TBを必要とするため、追加のフォルダー(各ファイルに2つあるため)に基づいて、必要に応じて、その "50"から "49"までは49 TBになりますか?
J Telep

1
@JTelep、それは科学表記です。50e12は、10の12乗の50倍です。50TBは必要ありません(必要な50TiBではありません50 * 2^40)。また、これらのフォルダによって発生するオーバーヘッドとして定義されているtotal_size += $2 + overhead場所に変更することもできoverheadます。KiBでディスク使用量を取得する%k代わりにも参照してください%s
ステファンChazelas

2

「ls」コマンドはタイムスタンプを使用してやや独創的です-そのため、それらを解析するのは面倒です。stat()を実装する言語でこれを実装する方がはるかに簡単でしょう。Unixの一部のバージョンには、近くのRHボックスにコマンドラインstatがあります。

 find ${BASEDIR} -type f -exec stat --format="%y %b %n" {} \; | sort | less

しかし、これは多数のファイルがある犬のように実行されます。

GNU awkのドキュメントには、ファイルシステム機能を提供する拡張機能の例が含まれていますが、これを構築して維持するには、いくつかの作業を行う必要があります。

PHP、C、Perl(またはgo、ruby、その他の多くの言語)でプログラムを最初から作成することは簡単ですが、ここでの投稿の範囲を超えています。


1
GNU statは、GNU がコマンドを使用しfindてからずっと後に追加されたことに注意してください-printf(これstatにより、はるかに優れたインターフェースでGNU と同じことができます)。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.