検索されたファイルの正確なサイズを出力にインポートします。

検索されたファイルの正確なサイズを出力にインポートします。

私のシェルエンジンはビジーボックス1.31.0またはバッシュ3.2

検索されたファイルのサイズを取得する必要があります。探す注文する。

私は60日以上前に修正されたファイルだけを見つけようとし、すべてのファイルのサイズをインポートしました(MB表記で1行にまとめることをお勧めします)。私が試したことは次のとおりです。

find -type f -mtime +60 -print0 | xargs -0 du -smc

そして

find -type f -mtime +60 -exec du -smc {} \;

前者は60日より古いすべてのファイルを1行ずつ検索します(ここまでは問題ありません)、奇妙なことに、すべての行の間でサイズを数回計算し、最後の行には次のものと一致しない「合計」サイズが表示されます。実際の出力の合計サイズです。こんな感じです。

.....
.....
0       ./FOLDER 2018/Copy #183 of ~$DATABASE OTHERS - NOV.18N.xlsx
42      ./FOLDER 2018/F9C8A618.tmp
0       ./FOLDER 2018/Copy #166 of ~$DATABASE PORTFOLIO NOV.18.xlsx
3275    total
10      ./FOLDER 2018/CFDC6981.tmp
2       ./FOLDER 2018/D5AAF4EB.tmp
0       ./LIFE INSURANCE/Copy #15 of ~$Copy of LIFE INSURANCE CLIENTS.xlsx
12      total

後者の出力は、一致する各ファイルのサイズを1行ずつ計算しますが、全体のサイズは計算しません。

私が探しているもの:

    0       ./FOLDER 2018/Copy #183 of ~$DATABASE OTHERS - NOV.18N.xlsx
    42      ./FOLDER 2018/F9C8A618.tmp
    0       ./FOLDER 2018/Copy #166 of ~$DATABASE PORTFOLIO NOV.18.xlsx
    10      ./FOLDER 2018/CFDC6981.tmp
    2       ./FOLDER 2018/D5AAF4EB.tmp
    0       ./LIFE INSURANCE/Copy #15 of ~$Copy of LIFE INSURANCE CLIENTS.xlsx
    54      total

または、すべての行の実際のサイズの結果はありません。

54      total

助けてくれてありがとう。

答え1

findtoの出力をパイピングしてフラグをdu付けてみてください。--files0-from -

find -type f -mtime +60 -print0 | du -shc --files0-from -

最後に合計を提供する必要があります

合計を取得するには、出力を次にパイプしますtail -n1

find -type f -mtime +60 -print0 | du -shc --files0-from - | tail -n1

私は実際にこれをbusyboxではなくgnu linuxを使ってテストしたことに言及したいと思います。見ている忙しい箱duページでは、このオプションはサポートされていないようです--files0-from

上記のコマンドを次のように変更して、busyboxで実行することができます。

find -type f -mtime +60 -print0 | xargs -0 du -ch | tail -n1

上記の方法は、名前にスペースと改行文字が含まれているファイルでも機能しますが、コマンドがあまりにも多くのファイルを見つけた場合、正しく機能しない可能性がありますfind。下記をご覧くださいコメント。ファイルが多すぎると思われる場合は、このページで別の回答を試してみてください。

答え2

原則として簡単です。複数のファイルをすぐにfind実行するように指示するだけです。du残念ながら、コマンドは複数回実行でき、パラメータのグループ化のみを試み、合計長がシステムのコマンドライン長の制限を超えると、すべてのパラメータをグループ化できないため、この方法は安定して動作しません。実際、BusyBox find(少なくともテストしたバージョン)はまったくグループ化しようとしません。一度に 1 つの引数である line を処理します。行を取得する方法はありません。
find . -type f -mtime +60 -exec du -smc {} +
-exec … {} +-exec … {} +-exec … {} \;total

duGNUに任意の長いファイル名のリストを読むように指示することができますが--files0-from、他のバージョンdu、特にBusyBoxバージョンはコマンドラインからのみファイル名を取得できます。

したがって、GNUがあると仮定できない場合は、GNUを複数回実行することを避けることはduできませんdu。つまり、合計を計算するための別のツールが必要であり、結果としてduサイズを丸める必要はありません。 awkの出力を解析できれば、合計は簡単ですdu

ファイル名に改行がないと仮定したり、改行を含むパスを除外したりできる場合は、出力をdu解析するのは簡単です。 1行に1つのファイルしかありません。

newline='
'
find . ! -path "*${newline}*" -type f -mtime +60 -exec du -k {} + |
awk '{kB += $1} END {printf "%d MB\n", (kB + 512) / 1024}'

答え3

蓄積したい場合ディスク使用量(使用法でduわかるように)60日より古い一般ファイルはGNUシステムとビジボックスシステムにのみ移植することができます。 1つのbusyboxインスタンスで動作するメソッドが次のインスタンスでも機能するかどうか)、次のことができます。

find . -type f -mtime +59 -print0 |
  xargs -r0 stat -c '%D:%i %b' | awk '
    !seen[$1]++ {sum += $2}
    END {print sum * 512}'

-mtime +59(はい、60 x 24時間より古いファイルが必要です-mtime +60。ファイルは60日に切り捨てられ、60は60より大きくないため、60.9日のファイルと一致しません。)

合計バイト数を報告します。ハードリンク(または他の場合、例:バンドルのインストール(同じファイルへのパスが複数ある場合があります)は一度だけ評価されます(GNUと同様に、busyboxは、ハードリンクが個々のディレクトリ引数の巡回duで見つからず、別の引数として渡される場合はduこれを行いません)。ただし、btrfsと同様に、btrfsなどのファイルシステムにファイルがコピーされた場合やファイルシステムが重複排除を実行している場合など、duハードリンク以外のファイル間で一部のデータが共有される状況は検出されません。cp --reflink=always

これはGNU固有のエントリと同じでなければなりません。

find . -type f -mtime +59 -print0 |
  du -cB1 --files0-from=- |
  awk 'END{print $1}'

POSIXlyでは、すべてのファイルが同じファイルシステムにあると仮定すると、次のことができます。

LC_ALL=C LS_BLOCK_SIZE=512 BLOCKSIZE=512 POSIXLY_CORRECT=1 \
  find . -type f -mtime +59 -exec ls -nisqd {} + | awk '
    !seen[$1]++ {sum += $2}
    END {print sum * 512}'

(GNUのようないくつかの実装はLS_BLOCK_SIZE=512 BLOCKSIZE=512 POSIXLY_CORRECT=1基本的にPOSIXと互換性がないという事実を解決するためです。これをサポートしていないbusyboxでは動作しません。 、そこには必要ありません)。lslsls-q?-q

その後(ここではGNUシステムで):

$ seq 10000 > a
$ truncate -s14T a
$ ln a b
$ touch -d '-60 days' a
$ BLOCKSIZE=1 ls -lis --full-time
total 98304
59944369 49152 -rw-rw-r-- 2 me me 15393162788864 2019-07-29 09:49:25.933 +0100 a
59944369 49152 -rw-rw-r-- 2 me me 15393162788864 2019-07-29 09:49:25.933 +0100 b
$ date --iso-8601=s
2019-09-27T09:50:03+01:00
$ du -h
52K     .

私に与えられた49152ものは2つの累積ディスク使用量ですが、aサイズb(28TiB)の合計またはディスク使用量サイズ(49152 x 2)とは異なります。

(上記の52Kには、現在のディレクトリファイルのディスク使用量も含まれています(.私の場合は4KiB)。

見かけの寸法の合計です。

find . -type f -mtime +59 -print0 |
  xargs -r0 stat -c %s | awk -v sum=0 '
    {sum += $0}; END{print sum}'

またはGNUを使用してくださいdu

find . -type f -mtime +59 -print0 |
  du -cbl --files0-from=- |
  awk 'END{print $1}'

またはPOSIXly(単一ファイルシステムに制限はありません):

LC_ALL=C find . -type f -mtime +59 -exec ls -nqd {} + |
  awk -v sum=0 '{sum += $5}; END {print sum}'

上記の例では、両方30786325577728(28TiB)を提供しています。

関連情報