MAC OSX / Bashの問題 - 日付で文字列を並べ替える

MAC OSX / Bashの問題 - 日付で文字列を並べ替える

CSVファイルにファイル出力がありますが、日時別に並べ替えたいのですが、日時は以下のように表示され、時間と年は異なる順番で表示されます。

ファイルのリストを生成するには、次のコマンドを使用します。

find /Volumes/myVolume  -type f -exec  ls -1 -aldT {} \; |cut -c35-300 |sort  -r -k5,5 -s |sort -k3,3 -s

1579099156  6 Apr 09:33:03 2023 /Volumes/myvolume/myfile

私のsortコマンドはうまくいきますが、2番目のソートフィールドは「月」なのでアルファ順にソートしますが、私はそれを月として処理して月順にソートしたいと思います。 (例:1月、2月、3月など)。

ファイルリストの生成方法を変更せずにこれを達成する方法はありますか?

必要に応じてファイルのリストを変更できます。これは、他のタスクを実行するために解析できるファイル出力の再帰的なリストを生成するのに役立ちます。

フィールドの順序を調整できますが、すべてのフィールドが表示され、ファイル名が常に最後に表示されるはずです。

答え1

zshOSXでは、glob修飾子を使用して変更時間ごとに一致するファイル名をソートするためのアクセス権が必要です。

/Volumes/myVolume/**/*(.DOm)

zstatその後、次に説明するのと同様の方法でそのモジュールを使用できます。各ファイルのサイズとともにテキストファイルのリストに保存されます。サイズと実行時間を取得して印刷します。だから(方法を直接調整してください)

zmodload -F zsh/stat b:zstat

zstat -F '%d %b %T %Y' -A data -n /Volumes/myVolume/**/*(.DOm)
for name _ _ _ _ _ _ _ size _ mtime _ _ _ in $data; do 
  printf '%s\t%s\t%s\n' $size $mtime $name
done

または、明示的なループを使用してください(読みやすさが高い可能性があります)。

zmodload -F zsh/stat b:zstat

for f in  /Volumes/myVolume/**/*(.NDOm); do
  zstat -LF '%d %b %T %Y' -H s -- $f &&
    printf '%s\t%s\t%s\n' $s[size] $s[mtime] $f
done

答え2

ls日付でファイルを並べ替える機能があります。

  ls -l[r]t

したがって、「逆方向」で作業できます。ls最初にファイルリストを使用してソートするのではなく、ファイルリストを最初に準備してからソートしますls

  ls -lrt $(find /start/dir -type f -print)

ls必要に応じてオプションを変更します。ただし、時系列でソートするには「t」を含める必要があります(逆順ソートを表すには「r」も可能です)。

答え3

日付は怖いもので、その構造はさまざまです。 Epochの時間は使えますか?簡単に並べ替える簡単な数字です。また、これによりコマンドの移植性が向上します。

find execパラメータに置き換えてください。

ls -1 -D "+%s" -alT

例:

user@host ~ % ls -1 -D "+%s" -alT minicom.log
-rw-r--r--  1 user  group  35 +1683075462 minicom.log
user@hose ~ % ls -1alT minicom.log
-rw-r--r--  1 user  group  35  3 May 12:57:42 2023 minicom.log

エポック時間をとって1683075462次のように変換するとdate

user@host ~ % date -r 1683075462
Wed  3 May 2023 12:57:42 NZST

Background、epoch/epoc 時間は Unix 時間とも呼ばれ、「1970 年 1 月 1 日 00:00 以降の秒数」を意味します。

関連情報