2017-09-26 47 views
0

我想要的文件名從 prod.test.PVSREGPLUS20170915-6777.DAT.gpgPVSREGPLUS20170915-0003.DAT.gpg如何獲得一個變量

我用這個

DTE=$(date +%I);ls prod.test* |cut -f 3,4,5 -d .|sed "s/\-/-00$DTE/" |cut -c 1-23,28-35 

我的問題改awk或者sed命令是我需要在這個命令一個shell腳本

"#! /bin/bash 

DTE=$(date +%I) 

newfile=$(ls prod.test* |cut -f 3,4,5 -d .|sed "s/-*./$DTE/"|cut -c 1-23,28-35 

該sed不能做擴展,會awk能夠做到這一點?任何幫助將不勝感激。由於

+0

你是什麼意思'該sed不能做擴展? sed可以做擴展就好了。你的shell腳本當然有其他的問題(例如''''''''''''''''''''''''''''''通過'shellcheck'運行。 –

+0

您改變了'sed'命令:腳本中的版本將會改變**第一個字符**到DTE值 –

+1

切題問題,我建議尋找'perl-rename'(參見例如[this](https://stackoverflow.com/questions/22577767/get- -lib-rename-utility-instead-of-the-built-in-rename)) –

回答

0

要做到這一點,最簡單的方法是使用一個for循環在glob模式,然後使用paramater擴張刪除前綴

prefix="prod.test." 
hour=$(date '+%I') 
for f in "$prefix"*; do 
    new=$(echo "${f#$prefix}" | sed 's/-[[:digit:]]\+/-00'"$hour"'/') 
    echo mv "$f" "$new" 
done 

我們真的不需要sed的:擴展模式和多個參數擴展

shopt -s extglob 
for f in "$prefix"*; do 
    new=${f#$prefix} 
    new=${new/-+([0-9])/-00$hour} 
    echo mv "$f" "$new" 
done 

刪除「回聲」,如果它看起來不錯。

或者,用perl的rename作爲意見提出:

rename -v -n 's/prod\.test\.//; use Time::Piece; s{-\d+}{"-00" . (localtime)->strftime("%I") }e' prod.test.* 

刪除 「-n」 如果它看起來不錯。

+0

謝謝,我真的很感激它,有時間更加努力地打開這本書,你們推薦些什麼,Glenn,你是一個高手! –