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
zsh
OSXでは、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 以降の秒数」を意味します。