ls
これらのオプションを使用すると、出力を時間でソートできることがわかります-t
。
ファイルが多すぎて一度のls
呼び出しに合わない場合は、通常xargs
(またはfind ... -exec ... {} +
)を使用してls
複数回呼び出すことができます。
この2つをどのように組み合わせることができますか?コマンドラインに入ることができるよりも多くのファイルがあり、時間ごとに並べ替えてリストしたいと思います。コマンドラインに正確に1000個のファイル名があり、3000個のファイルが存在すると仮定すると、これが実行され、最後の1000個のファイルは最初の1000個のファイルよりも早い修正時間を見る可能性が高いfind . -type f -exec ls -t {} +
ため機能しません。関連または同等の操作が実行される可能性がないようです。このアプローチは基本的に欠陥があるようですが、方法が見つかりません。ls -t [first 1000 files]; ls -t [second 1000 files]; ls -t [last 1000 files]
find
xargs
する働く
答え1
ls -t
それ自体は、コマンドラインにリストする必要なしに、現在のディレクトリ内のすべてのファイルをその順序でリストします。
再帰的な動作が必要なfind
場合、またはファイルに対して別のテストを実行している場合は、タイムスタンプ付きのエントリを作成してGNUオプションで並べ替えるfind
ことができます。それは次のとおりです。stat
find
-printf
find . -type f -printf '%T@ %p\0' | sort -zn
-printf '%T@ %p\0'
ヌルで区切られたUnixタイムスタンプ(%T@
) - ファイル名(%p
)のペアを生成します。sort -z
また、ファイル名のセキュリティを確保するためにnullで区切られたレコードを使用する非標準のGNU拡張です。sort
ほとんどのBSDもこのオプションをサポートしていますが、-printf
私が知っている限りGNUのみをサポートしています。
その出力をファイル名または必要な他の形式に切り捨てることができます。
答え2
Posixlyfind
で使用できます。perl
$ find ! -name . -prune -print | perl -lne '
$h{$_} = -M;
END { print for sort {$h{$a} <=> $h{$b}} keys %h }
'
これは、ファイル名に改行文字がないと仮定します。
改行を処理するには、次のようにします。
$ find ! -name . -prune -exec printf "%s\0" {} + | perl -0lne ...
またはコードでthenを使用してくださいperl -le
。split /\0/,<>
答え3
zshから:
print -rl -- *(om)
これグローバル予選 om
変更時間に基づいてファイルを並べ替えます(時間の逆順、例:最新の項目からls -t
)。Om
逆順(年代順など)を取得するために使用されますls -tr
。*(Dom)
ドットファイルを含めるようにしてください。
もちろん変更できます。模様、たとえば、**/*(Dom)
サブディレクトリとして繰り返されます。複数のパターンを使用するには、括弧内に入れて、|
演算子(たとえば)を使用して区切ります*.(png|jpg)(om)
。
print
シェル組み込みコマンドなので、このコマンドは最大コマンドライン長制限の影響を受けません。ファイルを一括して順次操作するために外部コマンドを呼び出そうとすると、長さ制限が発生します。printf '%s\0' *(om) | xargs -0 somecommand
xargs が null で区切られた入力 (Linux、*BSD) または zsh 独自の入力をサポートしている場合は、以下を使用して xargs にファイルを提供できます。zargs
:
autoload -U zargs
zargs -r -e '' -- *(om) '' somecommand
一度に 1 つのファイルを処理するには、単純なループを使用します。 zshを使用すると、これを短縮できます(cshスタイル)。
for x (*(om)) somecommand