作成日ごとにファイルを並べ替えるよりも良い方法はありますか?

作成日ごとにファイルを並べ替えるよりも良い方法はありますか?

作成日ごとにソートされたディレクトリのリストを表示する必要がありますが、かなり賢いと思われるこのコードスニペットを思い出しました。私が逃したよりも確実な方法はありますか?

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呼び出すと、sortこの問題を簡単に解決できます-z。ああ、そしてもうパニックにならないでくださいsed。 sedは文字を特殊文字として解釈するため、$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)

おすすめ記事