다음과 같은 파일 목록이 있습니다.
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