日付形式の変換

日付形式の変換

awkコマンドを使用して3つの列を切り捨てようとしています。

-rwxrwxr-x 1 rouser users 33 Oct 19 05:20 b.sh

次の行を使用して、19年10月33日の05:20値を切り取ります。

z=`ls -l b.sh | awk '{print $6,$7,$8 }'`
echo $z

zは33 Oct 19 05:20結果を提供します。

私の問題は、2016年19月10日の日付、月、年がこの形式で欲しいということです。
どうすればいいですか? ?
できるだけ早く助けてください。

ベストアンサー1

出力の解析に関するいくつかの注意ls:

  • 形式はロケールによって異なります。解析が必要な場合は、ロケールを既知のものに変更する必要があります。一般的にC
  • 出力では、ls -lユーザー名とグループ名が日付の前に表示され、スペースを含めることができるため(実際にはまれですが)、常に6番目のフィールドの日付に依存することはできません。ls -n代わりに、数値 uids/gids を使用することをお勧めします(-oまたは-gそれを含む実装を使用)。
  • ファイルタイプがディレクトリの場合、そのls -l file内容が一覧表示されます。このオプションが欲しい-dLC_ALL=C ls -nd -- "$file"これまで)
  • ファイル名(またはシンボリックリンクタイプファイルの場合はシンボリックリンクターゲット)に改行文字が含まれている場合は、出力の最初の行のみが考慮されることを確認する必要があります。

    LC_ALL=C ls -nd -- "$file" | awk '{print $6,$7,$8; exit}'
    
  • Cロケールでは、ファイルが最後の6ヶ月以内(または今後)に最後に変更されたかどうかによって、変更時間形式が異なります。したがって、2016-11-09で実行されている場合またはJun 14 09:18取得Feb 4 2014できます。Jan 1 2017年が指定されていない場合は、現在の年と見なすことはできません。たとえば、1月に実行して1つを取得すると、Dec 24 23:59昨年12月になります。

それでも、次のように解決できます。

LC_ALL=C ls -dn -- "$file" | awk -v now="$(date +%m:%Y)" '{
  m=$6; d=$7; y=$8
  m = index("--JanFebMarAprMayJunJulAugSepOctNov", m) / 3
  if (y ~ /:/) {
    split(now, a, ":")
    y = a[2]
    if (m > a[1]) y--
  }
  printf "%02d/%02d/%04d\n", d, m, y
  exit}'

しかし、最初から正しい形式で時間を取ることをお勧めします。 Passを使用すると、組み込みの機能をzsh使用できます。stat

zmodload zsh/stat
stat -LF %d/%m/%Y +mtime -- $file

GNUシステムでは、次のことができます。

date -r "$file" +%d/%m/%Y

(シンボリックリンクの場合は、ターゲットの修正時間を提供しますが)

または:

find -- "$file" -prune -printf '%Td/%Tm/%TY\n'

BSDから:

stat -t %d/%m/%Y -f %Sm -- "$file"

またはperl移植性のために:

perl -MPOSIX -le '@s = lstat shift or die "lstat: $!";
  print strftime "%d/%m/%Y", localtime $s[9]' -- "$file"

おすすめ記事