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

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

ディレクトリ内のすべてのファイルを一覧表示する方法はありますか?単一のリストで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

答え2

そしてzsh

print -rl -- **/*(D.om)

**/*すべてのレベルのサブディレクトリと一致します(シンボリックリンクに従わない)。D.修飾子は通常のファイルをリストし、om変更時間に基づいて最新のファイルからソートします。

ディレクトリ部分なしでファイル名を一覧表示するには、t履歴修飾子を追加します。

print -rl -- **/*(D.om:t)

答え3

まあ、何千ものファイルについて話し、ARG_MAX制限を超えた場合、結果はあまり良くありませんが、最も簡単な解決策は次のとおりです。

find . ! -type d -exec ls -t {} +

...見つかったすべてのファイルバッチを呼び出しますls<=ARG_MAXさらに、パス名の文字には任意の制限はなく、一緒に処理できる最大パラメータ数にのみ制限があります。

findの出力と同じ方法で出力を作成します。もちろん、-lGNUのような他のオプションも使用できます-h。以下は、私が一週間前に作った小さなツリーにリストされています。

find . ! -type d -exec ls -lht {} +

-rw-r--r-- 1 mikeserv mikeserv   0 Dec 19 19:00 ./dir/dir1/file
-rw-r--r-- 1 mikeserv mikeserv   0 Dec 19 19:00 ./dir/dir2/file
-rw-r--r-- 1 mikeserv mikeserv   0 Dec 19 19:00 ./dir/dir3/file
-rw-r--r-- 1 mikeserv mikeserv   0 Dec 19 19:00 ./dir2/dir1/file
-rw-r--r-- 1 mikeserv mikeserv   0 Dec 19 19:00 ./dir2/dir2/file
-rw-r--r-- 1 mikeserv mikeserv   0 Dec 19 19:00 ./dir2/dir3/file
-rw-r--r-- 1 mikeserv mikeserv   0 Dec 19 18:57 ./dir/file1
-rw-r--r-- 1 mikeserv mikeserv   0 Dec 19 18:57 ./dir/file2
-rw-r--r-- 1 mikeserv mikeserv   0 Dec 19 18:57 ./dir/file3
-rw-r--r-- 1 mikeserv mikeserv   0 Dec 19 18:57 ./dir2/file1
-rw-r--r-- 1 mikeserv mikeserv   0 Dec 19 18:57 ./dir2/file2
-rw-r--r-- 1 mikeserv mikeserv   0 Dec 19 18:57 ./dir2/file3

...明らかにディレクトリごとにグループ化されていません。

私のコンピュータで...

getconf ARG_MAX

2091752

...しかし、それは現実的ではないと思います。平均65万ウォン程度になると思います。

関連情報