<ブロック引用> 
 これは、引用符で囲まれていないコマンド置換に依存しています ( 
 ファイル名の合計の長さが長すぎると、エラーが発生します。 ( 
  
        
        
        
               
        
        
    
    
        
            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 を使用しても、これを確実に行う簡単な方法がないことはよく知られています。