名前に特定の文字列を含むファイルを見つけようとしますが、出力をソートする方法がわからないので、ファイル名のみを取得します。
私はもう試した
OLDDATA=`find . -regex ".*/[0-9.]+" | ls -t`
しかし、ls -tは検索結果ではなくディレクトリ全体で機能します
編集:このステートメントの結果は、変更日のディレクトリでソートする必要があります。この正規表現は、名前に数字とドットのみを含むディレクトリに一致すると想定しています。
ファイル名のみを取得...変更日でソート
find
+ sort
+ cut
アプローチ:
find . -regex ".*/[0-9.]+" -printf "%T@ %f\n" | sort | cut -d' ' -f2
%T@
-ファイルの最終変更時刻。ここで、@
は、小数部を含むJan. 1, 1970, 00:00 GMT,
から秒です。
%f
-先頭のディレクトリが削除されたファイルの名前(最後の要素のみ)
降順で並べ替えるには:
find . -regex ".*/[0-9.]+" -printf "%T@ %f\n" | sort -k1,1r | cut -d' ' -f2
あなたの方法は単純なケースで機能するように適応させることができます。あなたが直面している主な問題は、inputをls
に渡していますが、ls
は入力を受け取りません。 ls
はコマンドライン引数を取ります。したがって、find
の出力をargumentsとしてls
にコマンド置換で渡す必要があります。また、ディレクトリが一致する場合は、-d
をls
に渡して、ディレクトリではなくディレクトリ自体をリストします。
OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))
2つの制限があるため、単純な場合のみ:
$OLDDATA
の使用も同様です)。したがって、ファイル名に特殊文字(空白またはワイルドカード文字\[*?
)が含まれていないと想定しています。ls
の一部のバージョンでは、現在のロケールでは印刷できない文字が破損する場合があります。xargs
はファイル名の順序を正しくするために1回実行する必要があるため、find … -exec
とls
はここでは役に立たないことに注意してください。エラーを非表示にし、正しくソートされていない出力— xargs
の場合は、さらにいくつかの文字をマングルします。)これを行うための堅牢で簡単な方法は、 zsh を使用することです。 glob qualifiers のおかげで、ワイルドカードの一致をソートすることができます。
setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
**/
は、find
の使用を避けて、サブディレクトリを再帰的にトラバースします。##
は、zsh拡張グロブ構文で「前述の1つ以上」を意味し、(拡張)正規表現構文の+
に類似しています。(om)
は、ls -t
のように、変更時刻でファイルをソートするためのグロブ修飾子です。これをPOSIXツールで確実に、またはGNU toolsおよびkshでも)実行する簡単な方法はありません。