2014-10-04 39 views
-2

我在這裏有一種情況。 我在linux在unix中使用循環重命名文件

SIPTV_FIPTV_ID00$line_T20141003195717_C0000001000_FWD148_IPV_001.DATaac 
SIPTV_FIPTV_ID00$line_T20141003195717_C0000001000_FWD148_IPV_001.DATaag 

我想刪除$一行,並從0001計數器6000在其位我6000頁這樣的文件有很多文件,如下圖所示。 另外我想刪除尾部3個字符後,這是爲每個文件完成。

後修復文件應該像

SIPTV_FIPTV_ID0000001_T20141003195717_C0000001000_FWD148_IPV_001.DAT 
SIPTV_FIPTV_ID0000002_T20141003195717_C0000001000_FWD148_IPV_001.DAT 

請幫助。

+0

你對Perl感到滿意嗎? – Beta 2014-10-04 18:49:50

回答

0

隨着一些假設,我想這應該這樣做:文件 1.列表是一個input.txt中指定的文件中,每行 2.一個文件中的代碼在目錄中的文件都在 運行3.慶典可用

awk '{i++;printf "mv \x27"$0"\x27 ";printf "\x27"substr($0,1,16);printf "%05d", i;print substr($0,22,47)"\x27"}' input.txt | bash 
0

在命令提示符下輸入下列命令

% echo *.DAT??? | awk '{ 
    old=$0; 
    sub("\\$line",sprintf("%4.4d",++n)); 
    sub("...$",""); 
    print "mv", old, $1}' 
% 

並檢查輸出,如果它看起來OK

% echo *.DAT??? | awk '{ 
    old=$0; 
    sub("\\$line",sprintf("%4.4d",++n)); 
    sub("...$",""); 
    print "mv", old, $1}' | sh 
% 

評論:echo *.DAT???是爲了給awk提供一個你想修改的所有文件名列表,如果你給出的例子名稱不能代表整個光譜,你可能想要更清楚的表達一些東西。 ..關於awk腳本本身,我用sprintf生成一個正確數爲零的字符串替換$line,成語`「\\ $ ...」用兩個反斜槓來引用gawk所要求的美元符號並且在mawk中沒有任何傷害,作爲最後一句話我不得不說,在類似的情況下,我更喜歡在將命令傳遞給shell之前至少進行一次幹運行...