再帰的なディレクトリリストの出力を平坦化します。

再帰的なディレクトリリストの出力を平坦化します。

ディレクトリ内のすべてのファイルを一覧表示する方法はありますか?単一のリストでLinuxの修正時間に基づいてソートしますか?

ls -Rlt 

ファイルは繰り返し表示されますが、出力では異なるフォルダにグループ化されているため、出力は全体的に並べ替えられません。ただ、各ディレクトリの内容が時間ごとにソートされているだけです。

ベストアンサー1

はい、GNUを使用してこれを行うことができますfind。ファイル名に改行文字が含まれていない場合は、次のことができます。

find -printf '%T@ %p\n' | sort -gk1,1

説明する

  • オプションでさまざまな情報を印刷-printfできます。findこの例では、次を使用します。

    %Tk    File's last modification time in the format specified  by
           k, which is the same as for %A.
    @      seconds  since Jan. 1, 1970, 00:00 GMT, with fractional part.
    %p     File's name.
    

    したがって、%T@ %p\nエポック以降のファイル修正時間(秒単位%T@)、スペース、ファイル名(%p)が印刷されます。

  • 次に、最初のフィールド()のみが数値sortでソートされた()オブジェクトに渡されます。-n-k1,1

これにより、すべてのファイルとディレクトリが返されます。通常のファイル(ディレクトリ、デバイスファイル、リンクなどを除く)のみに制限するには、コマンドに-type f追加しますfind

人が読める日付を取得するには、GNUを使用して出力を処理できますdate

find -printf '%T@ %p\t\n' | sort -gk1,1 | 
    perl -lne 's/([^ ]*)//;chomp($i=`date -d \@$1`); print "$i $_"'

このperlコマンドは、空白ではなく最初の文字列(日付)をGNUで処理されたとおりに置き換えますdate


改行文字を含むファイル名の場合、上記の操作は失敗します。改行を処理するには、次のようにします。

find -printf '%p\t%T@\0' | sort -zt$'\t' -nk2 | tr '\0' '\n'

find代わりに、各ファイル名の末尾にaを出力することを除いて、これは同じです\0\nGNUはsortヌルで区切られた出力を処理できるため、まだ正しくソートされます。最後のtrコマンドは\0再び\n

おすすめ記事