+mtime、+mminオプションを使用したときの奇妙な動作「find command」

+mtime、+mminオプションを使用したときの奇妙な動作「find command」

本番サーバーがあります。特定のオブジェクトのディレクトリが1つありますが、別のネットワークノードからファイルを収集した後もファイルが蓄積されます。したがって、そのサブディレクトリには2021年5月のファイルが含まれます。通常、1時間ごとに1日分のサブディレクトリを作成し、そのサブディレクトリにファイルをプッシュします。サブディレクトリ構造 -

ここに画像の説明を入力してください。

次のコマンドを使用して、find . -type f -mtime +2 | xargs ls -ltr 2日前のファイルを一覧表示して削除しました。

ところで確認命令を実行してみると、意外なやり方でソートされていることがわかりました。

ここに画像の説明を入力してください。

上記のように、理想的には10-03ファイルを最初に短縮し、次に11-03ファイルを短縮する必要がありますが、正反対です。もう1つのことは、その日付(18-03)のファイルも一覧表示することです。だから誰かがそれについて少し明らかにすることができますか?

ディレクトリサイズは11Gです。そして、ファイルは通常1分ごとに積み重なっていますが、これが影響しますか?

ディストロ-Red Hat Enterprise Linuxサーバーバージョン7.6(Maipo)

答え1

find . -ctime +2ファイルレポート最後に変更されたステータス時間3日以上経過しました(find開始時刻とファイルのctimeの差(整数日数に丸め)が2より大きい)。

ctime印刷できる内容は、ls -lcファイルの内容が変更されると更新されます(アクセス時間を除く)。ディレクトリのエントリ名が変更されたとき、新しいディレクトリからリンクが解除されたとき、その内容が、権限またはその他のメタデータがあるときに変更...

ls -lデフォルトで表示され、デフォルトls -tでソートされるタイムスタンプは次のとおりです。最後の修正。この値は、内容が変更されたときにのみ更新されます(コマンドを使用して任意に設定することもできますtouch)。これは次のようになります。ファイルコンテンツの作成時間

その他最後のアクセス時間、一部のシステムでは出生時間また〜として知られています作成時間、一般的にはあまり良くないが最後の修正。最新バージョンのGNU ls(RHEL7システムにはありません)の場合ls -l --time=birthまたはとして表示されることがありますls -l --time=creation

2日以上前に最後に変更された一般ファイルを見つけて渡し、ls最も古いものから最新の順にリストするには、次のようにします。

find . -type f -mtime +1 -exec ls -lrtd {} +

which(withを除く)で処理できない出力を使用しないでくださいxargsfindfind -print0 | xargs -r0...

ただし、複数のインスタンスを実行できます。xargsこれにより、独立してソートされた複数のファイルバッチが出力されます。find -exec cmd {} +cmd

これを防ぐには、zsh次の方法を使用して実行できます。

autoload zargs
zargs -- ./**/*(D.m+1Om) -- ls -Uld

または、xargs分割にGNUを使用してください。

print -rNC1 -- **/*(ND.m+1Om) | xargs -r0 ls -Uld --

(ソートされていないGNU拡張です-U(すでにソートされているため必要ありません)。他の実装に置き換えることができます)。lszsh-rtls

いつでもまったく分割しないように試みることができますが、コマンドに渡して確認できる長さまたは引数+環境の制限が発生する可能性があります。パラメータリストが長すぎます。間違い:

ls -lrtd -- **/*(D.m+1oN)

findzsh、sortおよびsedユーティリティのGNU実装を使用してzshをインストールできない場合xargslsRHEL7で表示されます)、次のことができます。

find . -type f -mtime +1 -printf '%T@:%p\0' |
  LC_ALL=C sort -zn |
  LC_ALL=C sed -z 's/^[^:]*://' |
  xargs -r0 ls -Uld

findファイルを数字で印刷し、mtimeで手動でソートし、次のように%T@ソートします。これはすべてNULで区切られたレコードを使用して実行されるため、任意のファイルパスを使用できます。sort -nsedxargsls-U

とにかくGNUを使用してこれらのファイルを削除するには、適切な述語をfind使用します-delete

find . -type f -mtime +1 -delete

関連情報