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'\')

答え2

このスクリプトは私にとって効果的です。

#!/bin/bash
#
while IFS= read -r line; do
  find "$line" -printf '%T@ %p\n'
done | sort -k 1nr | sed 's/^[^ ]* //' | head -n 10

次のようにパイプできますfind

(0)asus-romano:~/tmp% find . -type f | ./script11.sh
./script11.sh
./script10.sh
[...]

zshはるかに高速なグローバルエイリアスを使用できますが、それはないようですbash

(0)asus-romano:~/tmp% alias -g showlast10="-printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //' | head -n 10"
(0)asus-romano:~/tmp% find . -type f showlast10
./script11.sh
./script10.sh
./Just  tab.xyz
[...]

答え3

まず、同様のスクリプトを作成してshowLatest使用findすることは確実に可能です。ただし、各ファイルを2回確認する必要があります。

したがって、これは最後の質問に対する答えではありませんが、最初に説明した問題を解決する必要があります。つまり、照会する柔軟な引数のリストを提供する方法です。

sfind.sh:

#!/bin/bash
find "${@:1:$[$#-1]}" -printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //' | head -n ${@:$#:1}

一般的な呼び出しはですsfind.sh [find-parameters] countsfind.sh src -type f -iname \*.py 10

説明する:

  • $@スクリプトに渡されたパラメーターのリストが含まれています。
  • $#$@の長さです。
  • ${@:1:$[$#-1]}最後のパラメータを除くすべてのパラメータ
  • ${@:$#:1}最後のパラメータ

関連情報