ファイルを作成日順に並べ替えるのに、これより良い方法はありますか?

ファイルを作成日順に並べ替えるのに、これより良い方法はありますか?

作成日順に並べたディレクトリのリストを表示する必要があり、このコード スニペットを思いつきました。これはなかなか巧妙だと思いました。私が見逃している、もっと明白な方法はありますか?

printf "%-20s\t\t\t%-s\n" "DATE" "CASE"
printf "%-20s\t\t\t%-s\n" "----" "----"

find $idir -mindepth 3 -maxdepth 3 -type d -printf "%T@ %Tc\t\t%p\n" \
     | sed "s#${idir}/##" \
     | sort -h \
     | sed "s#^[^ ]* ##"

サンプル出力

DATE                                    CASE
----                                    ----
Fri 06 Sep 2013 11:17:41 AM EDT         dir1/Baseline/2013_09_06_11_16_10
Fri 06 Sep 2013 01:44:38 PM EDT         dir2/Baseline/2013_09_06_13_42_48
Sun 08 Sep 2013 05:02:46 PM EDT         dir3/6 Month/2013_09_08_17_02_05
Fri 13 Sep 2013 02:28:30 PM EDT         dir4/Baseline/2013_09_13_14_25_09

詳細

上記は、ディレクトリからちょうど 3 ディレクトリ下の階層を検索します$idir。次に、この階層で見つかったディレクトリの作成時刻を出力します。次に、$idir出力からパスの部分を削除し (不要なので)、並べ替えてから、%T@出力の一部を切り取ります。これは、出力をより簡単に並べ替えるためだけに行いました。

末尾がない場合のsed出力は次のようになります。

DATE                                    CASE
----                                    ----
1378480661.2612650000 Fri 06 Sep 2013 11:17:41 AM EDT           dir1/Baseline/2013_09_06_11_16_10
1378489478.3223970000 Fri 06 Sep 2013 01:44:38 PM EDT           dir2/Baseline/2013_09_06_13_42_48
1378674166.7427782000 Sun 08 Sep 2013 05:02:46 PM EDT           dir3/6 Month/2013_09_08_17_02_05
1379096910.4431689000 Fri 13 Sep 2013 02:28:30 PM EDT           dir4/Baseline/2013_09_13_14_25_09

もっときれいな方法を教えます!

答え1

ファイルを時間順に並べ替える、優れた移植可能な方法はありません。最も移植性の高い方法は次のとおりです。

  • ファイル名に印刷可能な文字のみが含まれていると想定できる場合は、 を呼び出しますls -ltd
  • それ以外の場合は、perl を使用します。

これは、GNU ツールを使用して日付順にファイルを並べ替える古典的な方法です。ファイル名に改行が含まれていないことを前提としていますが、これを に変更して\nオプションを付けて\0呼び出すことで簡単に修正できます。ああ、回りくどい呼び出しはやめてください。に が含まれていると、sed がそれらを特殊文字として解釈するため、スクリプトが機能しないことに注意してください。sort-zsed$idir#*^$\[

cd "$idir" &&
find -mindepth 3 -maxdepth 3 -type d -printf '%T@ %Tc\t\t%p\0' |
sort -hz |
tr '\0\n' '\n\0' |
sed 's/^[^ ]* //'

ちなみに、ファイルは作成時間ではなく変更時間で並べ替えられています。OSX 以外のほとんどの Unix バリアントでは、作成時間全体 (ファイルシステムからカーネル、ユーザーランド ツールまで) をサポートしていません。

ファイルを変更日時で並べ替える簡単でクリーンな方法は、zsh を使用することです。glob 修飾子omは、ファイルを古い順に並べ替えます (Om最も古いファイルを最初に取得する場合に使用します)。

files=(*(om))
echo "The oldest file is $files[-1]"

あなたが示しているような出力を得るには、次のようにします。zstat

zmodload zsh/stat
describe () {
  typeset -A st
  zstat -s -H st "$REPLY"
  echo "$st[mtime] $REPLY"
}
: */*/*(/+describe)

関連情報