GNU/Linux >> Linux の 問題 >  >> Linux

Findステートメントの結果を日付でソートする方法は?

<ブロック引用>

ファイル名のみを取得 ... 変更日でソート

find + sort + cut アプローチ:

find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort | cut -d' ' -f2
  • %[email protected] - ファイルの最終変更時刻 (@) です Jan. 1, 1970, 00:00 GMT,以降 小数部あり

  • %f - 先頭のディレクトリを削除したファイルの名前 (最後の要素のみ)

降順で並べ替えるには:

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

あなたの方法は、単純なケースで機能するように適応させることができます。あなたが直面している主な問題は、input を渡していることです lsまで 、しかし ls 入力を受け付けません。 ls コマンドライン引数を取ります。したがって、 find の出力を渡す必要があります 引数として ls まで 、コマンド置換付き。また、ディレクトリが一致した場合は、-d を渡します。 ls まで 内容ではなく、ディレクトリ自体を一覧表示します。

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

2 つの制限があるため、単純な場合のみ:

<オール>
  • これは、引用符で囲まれていないコマンド置換に依存しています ($OLDDATA の使用も同様です) その後)。したがって、ファイル名に特殊文字 (空白またはワイルドカード文字 \[*? ).
  • ls のいくつかのバージョン 現在のロケールでは印刷できない文字を壊す可能性があります。
  • ファイル名の合計の長さが長すぎると、エラーが発生します。 (find … -exec に注意してください と xargs ls 以来、ここでは役に立ちません ファイル名の順序を正しくするには、一度実行する必要があります。彼らができることは、エラーを隠して、正しくソートされていない出力を生成することだけです — xargs の場合、さらに数文字をマングルします。 .)
  • これを行うための堅牢で簡単な方法は、zsh を使用することです。 glob 修飾子のおかげで、ワイルドカードの一致を並べ替えることができます。

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

    POSIX ツールや GNU ツールと ksh を使用しても、これを確実に行う簡単な方法がないことはよく知られています。


    Linux
    1. findおよびduコマンドを使用してLinuxで大きなファイルを検索する方法

    2. Du出力をサイズで並べ替える方法は?

    3. Coreutilの日付はどのようにしてそのような奇妙な結果を得ることができますか?

    1. ある場所にあるすべてのディレクトリを幅優先で再帰的に一覧表示するにはどうすればよいですか?

    2. Linux で「find」の結果を mv にパイプする方法

    3. ls コマンドの結果を変更日 (ディレクトリが最初) でソートする方法は?

    1. Linuxで変更日時に基づいてファイルを検索およびソートする方法

    2. Lsを実行し、作成された日付で結果を並べ替える方法は?

    3. Linux –ファイルの作成日を見つける方法は?