findの出力を別のfindにパイプする方法

findの出力を別のfindにパイプする方法

find見つかったファイルを修正時間に基づいてソートする方法を検索しています。この回答次の注文を提供します。

find . -type f -printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //' | head -n 10

上記の問題は、私が覚えておらず、find適用することを選択したパラメータを使用して私の呼び出しを介して提供できるように、これをシェルスクリプトにパッケージ化する方法が見つからないことです。たとえば、showLatest次のことができるように、上記の内容をシェルスクリプト ""形式でパッケージ化するにはどうすればよいですか?

find src -type f -iname \*.py | showLatest 10

ベストアンサー1

zshではパターンの終わりshowLatest 10にあります。(om[1,10])これらはすべてグローバル予選;om修正時間に基づいて並べ替え(最も若いものから)、[1,10]最初の10件の一致を選択します。

find src -type f -iname \*.pyはい(自分に入れる前に実行する必要がprint -lr src/**/(#i)*.py(D.)あります)。setopt extended_glob~/.zshrc

ワイルドカードフラグは、バージョンと同様に、隠しファイルと隠しディレクトリのファイルを含む通常の.ファイルのみをフィルタリングします。はDfind(#i)ワイルドカードフラグこれにより、パターンの残りの部分が大文字と小文字を区別しなくなります。

print -lrprint -lr --引数を1行に1つずつ印刷します(最初の引数がダッシュで始まる場合はその引数を印刷します)。 2つを組み合わせて最新のファイルを入手してください。

print -lr src/**/(#i)*.py(D.om[1,10])

実際には に短縮できますprint -lr src/**/*.py(om[1,10])

zshでは、おそらくこれは必要ありません。なぜなら、ファイルのリストを取得するときに、少なくともファイルのリストがすべて単一のスキーマから出た場合にソートできるからです。これはshowLatest、任意のファイルのリストを処理できるzshで実装されたメソッドです。残念ながら、omglob修飾子は単一のパターンにのみ適用でき、単一のパターンは単一のディレクトリまたはツリー内のファイルとのみ一致できます。この問題を解決する方法は、glob修飾子を使用して一致結果にランダムなリストを挿入することeです。+その後、ソートを実行するためにglob修飾子が適用されますo。組み込み修飾子はe/+オーバーライドされた結果には影響しませんが、カスタム修飾子(oeまたはo+)は影響を与えます(zsh 5.0.5以降)。

#!/usr/bin/env zsh
zmodload zsh/stat
files=("${(@f)$(<&0)}")
print -lr .(e\''reply=($files)'\'noe\''stat -A REPLY +mtime -- $REPLY'\')

おすすめ記事