2017-09-28 46 views
1

我想單個文件prt-dealrpt,將其分成多個文件,根據文件中的特定字符串重命名文件,並允許重複使用(1), (2)等文件名的末尾。使用字符串批量重命名多個文件並允許重複使用

這裏是文件的一部分:

Vendor: GREAT LAKES     Buyer - Melissa   APU/DND 
     Begin Date: 10/16/2017 
     End Date: 12/08/2017 

Vendor: SENECA      Buyer - Bill   This is a note 
     Begin Date: 10/16/2017 
     End Date: 12/08/2017 

Vendor: MC-CAIN      Buyer - Bill   APU/DND 
     Begin Date: 10/16/2017 
     End Date: 12/08/2017 

Vendor: MC-CAIN      Buyer - Ethan   APU\DND 
     Begin Date: 10/16/2017 
     End Date: 12/08/2017 

編輯:上述文件在同一行上的供應商名稱已更以下。大多數文件不會重命名,因爲它正在查找AUP/DND目錄。那些重命名的人實際上是重命名該行的最後一部分,因此在本例中,供應商SENECA的新名稱將是This is a note.dat

我需要將文件在每次使用這個詞Vendor 我的分裂成功地這樣做了殼名爲split.sh

csplit --prefix page --suffix-format %02d.dat prt-dealrpt '/^Vendor/' '{*}' 

這將創建文件名爲page00.datpage001.datpage02.dat等。

接下來我試圖將文件重命名爲供應商名稱。我這樣做有一個批處理文件名爲fixname.bat

@echo off 

for %%i in ("C:\Users\waker\Documents\Unipro\Vendor\*.dat") do (
    for /f "tokens=2 delims=:" %%j in ('findstr /B "Vendor" "%%i"') do (
    ren "%%i" "%%j.temp_dat" 
) 
) 

ren *.temp_dat *.dat 

這工作但它不允許重複。它將跳過將創建重複名稱的文件。使用上面的例子,我將留下GREAT LAKES.datSENECA.datMC-CAIN.datpage03.dat。我想要重複命名爲MC-CAIN(2).dat

任何幫助將不勝感激,也如果有人有建議這樣做所有與一個按鈕,而不是運行兩個單獨的命令。

我正在運行Windows 10上安裝了「Windows上Ubuntu上的Bash」。

回答

0

我會把類似以下到一個bash腳本,並在該目錄與您的網頁執行它* .dat文件:

newext="temp_dat" 
for i in page*.dat; 
do 
     filename=$(grep 'Vendor' $i|sed 's/^.*Vendor:\ *\(..*\) *Buyer.*/\1/;s/\ *$//'); 
     if [[ $filename == '' ]]; then 
       echo "Skipping file $i with no Vendor" 
       continue; 
     fi 
     dstfile="${filename}.${newext}" 
     if [[ -e "$dstfile" ]]; then 
       dstfile="${filename} (1).${newext}"; 
       if [[ -e "$dstfile" ]]; then 
         lastfilenum=$(ls -1 "${filename} ("*").${newext}"|sort|tail -1|sed "s/^.* (\(.*\)).*/\1/") 
         nextfilenum=$(expr $lastfilenum + 1) 
         dstfile="${filename} (${nextfilenum}).${newext}" 
       fi 
     fi; 
     mv "$i" "$dstfile" 
done 

我assumming的Windows慶典附帶有可用的標準GNU工具Linux如:grep,sort,tail和sed。

當我跑了我的Linux機器上我得到了與上面的代碼中script.sh以下結果:

[[email protected] so]$ ls 
page00.dat page02.dat page04.dat script.sh 
page01.dat page03.dat prt-dealrpt 
[[email protected] so]$ ./script.sh 
Skipping file page00.dat with no Vendor 
[[email protected] so]$ ls -1 
GREAT LAKES.temp_dat 
MC-CAIN (1).temp_dat 
MC-CAIN.temp_dat 
page00.dat 
prt-dealrpt 
script.sh 
SENECA.temp_dat 
[[email protected] so]$ 
+0

感謝您抽出寶貴的時間!我將它保存到fixname.sh中,並將其放在我的頁面* .dat文件所在的目錄中。當我嘗試從Bash運行它時,我得到 ./fixname.sh:第2行:語法錯誤附近的意外標記'$'\ r'' '/fixname.sh:第2行:'爲我在頁面*中。 DAT; – Bill

+0

我認爲這是因爲Windows txt文件需要回車自動放置在文件中,如果你使用編輯器如記事本來創建它。你可能想嘗試像notepad ++這樣的編輯器來編輯bash腳本。 嘗試以下命令以從文件中除去回車符並創建fixname2.sh:'cat fixname.sh | sed的/ \ r $ //'> fixname2.sh' –

+0

謝謝,刪除回車符合正常工作。腳本運行但出錯。看到上面的編輯,我沒有包含原始prt-dealrpt文件中的所有信息,我在上面添加了更多。 – Bill