ファイル名からディレクトリ名を取得する

ファイル名からディレクトリ名を取得する

ファイル名の一部を抽出してディレクトリ名を作成したいと思います。ここにいくつかの例があります。

  1. server.log.2016-03-20-1420160320
  2. server-2016-03-17-13-16-Restart.log20160317

私はHP-UXを使用しています。

答え1

これを達成するためにawkを使用することができます。

1)

echo server.log.2016-03-20-14 | awk -F'[.]' '{print $3}' | awk -F'[-]' '{print $1$2$3}'

2)

echo server-2016-03-17-13-16-Restart.log | awk -F'[-]' '{print $2$3$4}'

答え2

sed を使用して、正規表現チェックにファイル名を渡すことができます。

echo server.log.2016-03-20-14 | sed 's/server\.log\.\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\1\2\3/g'

echo server-2016-03-17-13-16-Restart.log | sed 's/server-\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-Restart.log/\1\2\3/g'

たとえば、より厳密な正規表現が必要な場合は、正規表現を使用して月を記述できます。

0[0-9]\|1[12]

その日は

0[1-9]\|[12][0-9]\|3[01]

答え3

シェルの文字列操作構成を使用してこれを実行できます。これにはPOSIXシェルが必要なため、以前のバージョンのHP-UXを実行している場合は、Bourneシェルの代わりにPOSIXシェル(kshなど)を呼び出す必要があります。

日付を解析する方法を完全に指定していません。????-??-????数字の最初の出現が希望の日付であるとします。

p=${0#*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]}
s=${0#"$p"}; p=${0%"$p"}
p=${p#"${p%??????????}"}
year=${p%??????}; p=${p#?????}
month=${p%???}; day=${p#???}
echo "$year$month$day"

最も読みやすいコードではありませんが、動作します。

関連情報