次のファイルのリストがあります。
lab-1:/tmp/tmp.NMFaDO# ls
webserver.123.net.1970-01-01.csv webserver.123.net.2016-10-01.csv webserver.123.net.2017-10-01.csv
webserver.123.net.2015-11-01.csv webserver.123.net.2016-11-01.csv webserver.123.net.2017-11-01.csv
webserver.123.net.2015-12-01.csv webserver.123.net.2016-12-01.csv webserver.123.net.2017-12-01.csv
webserver.123.net.2016-01-01.csv webserver.123.net.2017-01-01.csv webserver.123.net.2018-01-01.csv
webserver.123.net.2016-02-01.csv webserver.123.net.2017-02-01.csv webserver.123.net.2018-02-01.csv
webserver.123.net.2016-03-01.csv webserver.123.net.2017-03-01.csv webserver.123.net.current.csv
webserver.123.net.2016-04-01.csv webserver.123.net.2017-04-01.csv webserver.123.net.db.done
webserver.123.net.2016-05-01.csv webserver.123.net.2017-05-01.csv webserver.123.net.records_to_delete.txt
webserver.123.net.2016-06-01.csv webserver.123.net.2017-06-01.csv sip2.ci2.lab.jwm2.net.2018-02-01.csv
webserver.123.net.2016-07-01.csv webserver.123.net.2017-07-01.csv sip2.ci2.lab.jwm2.net.db.done
webserver.123.net.2016-08-01.csv webserver.123.net.2017-08-01.csv sip2.ci2.lab.jwm2.net.records_to_delete.txt
webserver.123.net.2016-09-01.csv webserver.123.net.2017-09-01.csv
Bashスクリプトでは、このリストを繰り返してファイル名の日付部分のみを抽出する必要があります。私は
以下を使ってファイルを含むフォルダ内でこれを行う方法を見つけました。
lab-1:/tmp/tmp.NMFaDO# ls webserver.123.net*.csv | sed 's/webserver.123.net.\(.*\)\.csv/\1/'
1970-01-01
2015-11-01
2015-12-01
2016-01-01
2016-02-01
2016-03-01
2016-04-01
2016-05-01
2016-06-01
2016-07-01
2016-08-01
2016-09-01
2016-10-01
2016-11-01
2016-12-01
2017-01-01
2017-02-01
2017-03-01
2017-04-01
2017-05-01
2017-06-01
2017-07-01
2017-08-01
2017-09-01
2017-10-01
2017-11-01
2017-12-01
2018-01-01
2018-02-01
current
しかし、私のbashスクリプトでロジックが機能していないようです。
dir=/tmp/tmp.NMFaDO
server=webserver.123.net
for csvfile in $dir/$server.*.csv
do
echo $csvfile | sed 's/$dir\/$server.\(.*\)\.csv/\1/'
done
現在、次のように名前のフルパスを印刷しています。
/tmp/tmp.NMFaDO/webserver.123.net.1970-01-01.csv
/tmp/tmp.NMFaDO/webserver.123.net.2015-11-01.csv
など。
bashスクリプトで私が何を見逃しているのか教えてくれる人はいますか?ありがとうございます。
答え1
このようなファイル名形式を使用すると、拡張子を削除してから最後のドットの前にあるすべての項目を削除できます。
パラメータを使用した拡張:
for f in ./webserver.123.*; do
d=${f%.csv} # remove trailing .csv
d=${d##*.} # remove all up to (now) last .
echo "filename: $f date: $d"
done
またはsedを使用してください:
for f in ./webserver.123.*; do
d=$(echo "$f" | sed -e 's/\.csv$//' -e 's/.*\.//');
echo "filename: $f date: $d";
done
答え2
使用している引用を参照してください。
dir=/tmp/tmp.NMFaDO
server=webserver.123.net
for csvfile in $dir/$server.*.csv
do
echo "$csvfile" | sed "s|$dir/$server.\(.*\)\.csv|\1|"
done
スペース/メタ文字を含むすべてのリテラルは「二重引用符」として扱われます。すべて拡張:"$var"
、、、、。"$(command "$var")"
コードやテキストについてはを参照してください。"${array[@]}"
"a & b"
'single quotes'
$'s: 'Costs $5 US'
ssh host 'echo "$HOSTNAME"'
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words