<ブロック引用>
これは、引用符で囲まれていないコマンド置換に依存しています (
ファイル名の合計の長さが長すぎると、エラーが発生します。 (
Linux
ファイル名のみを取得 ... 変更日でソート
find
+ sort
+ cut
アプローチ:
find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort | cut -d' ' -f2
-
%[email protected]
- ファイルの最終変更時刻 (@
) 秒ですJan. 1, 1970, 00:00 GMT,
以降 小数部あり -
%f
- 先頭のディレクトリを削除したファイルの名前 (最後の要素のみ)
降順で並べ替えるには:
find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort -k1,1r | cut -d' ' -f2
あなたの方法は、単純なケースで機能するように適応させることができます。あなたが直面している主な問題は、input を渡していることです ls
まで 、しかし ls
入力を受け付けません。 ls
コマンドライン引数を取ります。したがって、 find
の出力を渡す必要があります 引数として ls
まで 、コマンド置換付き。また、ディレクトリが一致した場合は、-d
を渡します。 ls
まで 内容ではなく、ディレクトリ自体を一覧表示します。
OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))
2 つの制限があるため、単純な場合のみ:
<オール>$OLDDATA
の使用も同様です) その後)。したがって、ファイル名に特殊文字 (空白またはワイルドカード文字 \[*?
).ls
のいくつかのバージョン 現在のロケールでは印刷できない文字を壊す可能性があります。find … -exec
に注意してください と xargs
ls
以来、ここでは役に立ちません ファイル名の順序を正しくするには、一度実行する必要があります。彼らができることは、エラーを隠して、正しくソートされていない出力を生成することだけです — xargs
の場合、さらに数文字をマングルします。 .)これを行うための堅牢で簡単な方法は、zsh を使用することです。 glob 修飾子のおかげで、ワイルドカードの一致を並べ替えることができます。
setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
- これは他のプログラムを呼び出さないため、使用可能なメモリ以外に長さの制限はなく、どの時点でもファイル名が壊れるリスクはありません。
- 結果はリストです 文字列 (各文字列はファイル名) であり、文字列ではないため、配列変数に入ります。
**/
find
の使用を避けて、サブディレクトリを再帰的にトラバースします .##
zsh 拡張グロブ構文で「前述の 1 つ以上」を意味し、+
に類似しています。 (拡張) 正規表現構文で。(om)
ls -t
のように、変更時刻でファイルをソートする glob 修飾子です。 .
POSIX ツールや GNU ツールと ksh を使用しても、これを確実に行う簡単な方法がないことはよく知られています。