Find ステートメントの結果を日付別に並べ替えるには?

Find ステートメントの結果を日付別に並べ替えるには?

名前に特定の文字列が含まれていますが、出力を並べ替える方法がわからないファイルを見つけようとすると、ファイル名のみを取得できます。

頑張った

OLDDATA=`find . -regex ".*/[0-9.]+" | ls -t`

ただし、ls -tは検索結果では機能しませんが、ディレクトリ全体では機能しません。

編集:このステートメントの結果は、変更日のディレクトリーに基づいてソートする必要があります。この正規表現は、名前に数字とドットのみを含むディレクトリと一致すると想定されます。

答え1

ファイル名のみインポート...変更日別に並べ替え

find+sort+cut方法:

find . -regex ".*/[0-9.]+" -printf "%T@ %f\n" | sort | cut -d' ' -f2

  • %T@- ファイルが最後に変更された@日付第二Jan. 1, 1970, 00:00 GMT,少数部があるから

  • %f- すべての先行ディレクトリファイル名を削除します(最後の要素のみ)。


降順で並べ替えるには:

find . -regex ".*/[0-9.]+" -printf "%T@ %f\n" | sort -k1,1r | cut -d' ' -f2

答え2

あなたの方法は簡単な状況に適用することができます。あなたが直面する最大の問題は、あなたが合格していることです入力するに入力しますlsが、lsどの入力も許可しません。lsコマンドライン引数を受け入れます。したがって、find次のように出力を渡す必要があります。議論にはlsコマンド置換を使用します。また、ディレクトリが一致する場合、 to を渡すと、その-dコンテンツlsではなくディレクトリ自体が一覧表示されます。

OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))

2つの制限があるので、単純な場合にのみ可能です。

  1. これは次のように異なります。引用符なしでコマンドを置き換える(以降の使用にも同じことが当てはまります$OLDDATA。) したがって、ファイル名に特殊文字(スペースまたはワイルドカード\[*?)が含まれていないとします。
  2. 一部のバージョンでは、ls現在のロケールで印刷できない文字が破損する可能性があります。
  3. ファイル名の合計長が長すぎると、エラーメッセージが表示されます。 (ファイル名を正しい順序で取得するには一度実行する必要があるため、ここでは役に立ちません。それらがfind … -execできることは、エラーを隠して正しく整列していない出力を生成することです。この場合、より多くの文字が破損します。の.)xargslsxargs

これを行うための強力で簡単な方法は、次のものを使用することです。扱いにくい。これにより、ワイルドカードの一致を並べ替えることができます。グローバル予選

setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
  • 他のプログラムを呼び出さないため、使用可能なメモリ以外に長さ制限はなく、いつでもファイル名が破損する危険性はありません。
  • 明らかにするリスト文字列(各文字列はファイル名)ではなく文字列なので、配列変数に入ります。
  • **/サブディレクトリを再帰的に探索しますfind
  • ##+(拡張)正規表現構文に似たzsh拡張glob構文では、「前の1つ以上」を意味します。
  • (om)変更時間ごとにファイルをソートするために使用されるグローバル修飾子ls -t

私たち全員が知っているように、POSIXツールやGNUツールとkshを使ってこれを強く行う簡単な方法はありません。

関連情報