
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
ワイルドカードフラグは、バージョンと同様に、隠しファイルと隠しディレクトリのファイルを含む通常の.
ファイルのみをフィルタリングします。はD
find
(#i)
ワイルドカードフラグこれにより、パターンの残りの部分が大文字と小文字を区別しなくなります。
print -lr
print -lr --
引数を1行に1つずつ印刷します(最初の引数がダッシュで始まる場合はその引数を印刷します)。 2つを組み合わせて最新のファイルを入手してください。
print -lr src/**/(#i)*.py(D.om[1,10])
実際には に短縮できますprint -lr src/**/*.py(om[1,10])
。
zshでは、おそらくこれは必要ありません。なぜなら、ファイルのリストを取得するときに、少なくともファイルのリストがすべて単一のスキーマから出た場合にソートできるからです。これはshowLatest
、任意のファイルのリストを処理できるzshで実装されたメソッドです。残念ながら、om
glob修飾子は単一のパターンにのみ適用でき、単一のパターンは単一のディレクトリまたはツリー内のファイルとのみ一致できます。この問題を解決する方法は、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] count
。sfind.sh src -type f -iname \*.py 10
説明する:
$@
スクリプトに渡されたパラメーターのリストが含まれています。$#
$@の長さです。${@:1:$[$#-1]}
最後のパラメータを除くすべてのパラメータ${@:$#:1}
最後のパラメータ