2012-07-31 64 views
1

我知道這已被多次覆蓋,但我仍然無法得到這個特定方面的良好解決方案。我在bash和DOS中都有同樣的問題。我有許多名爲abcYYMMDDf.csv的.csv文件的文件,我想將文件名更改爲與創建日期相對應的YYMMDD部分。注意YYMMDD之後的「f」,所以我真的想要一個相當於excel的mid()來取中間日期。批量重命名替換爲部分原始文件名DOS和Bash

在bash我瞭解重命名功能,和通配符*我試着

rename abc*f.csv *.csv abc* 

變化以爲*將站在爲YYMMDD但顯然事實並非如此。 我看到了另一種涉及選擇s /([a-z] *)的方法,但是它只會確保整個文件名?

在DOS我試過

ren abc*f.csv *.csv 

回答

2

Bash參數擴展可以分別用兩個步驟剝離'abc'和'f',分別使用前綴刪除和模式替換。

for f in abc*f.csv; do 
    new_f=${f#abc} 
    new_f=${new_f/%f.csv/.csv} 
    mv $f $new_f 
done 

你可以使用sed在位置參數擴展到在一個步驟刪除「ABC」和「F」:

for f in abc*f.csv; do 
    new_f=$(echo $f | sed 's/abc\(.*\)f/\1/') 
    mv $f $new_f 
done 

我不能回答的DOS版本;你最好在另一個問題中提問。

+0

非常好,非常感謝。我使用了重命名的組合來移除abc,然後使用f的第一部分答案。我第一次嘗試第二個循環,它不斷給我一個關於沒有輸出文件的錯誤消息,有沒有我沒有指定在那個循環中會返回該消息? – stackmeistergeneral 2012-07-31 13:04:29

+0

和往常一樣,我在sed電話中犯了一個錯誤。固定。 – chepner 2012-07-31 13:12:36

0

對於慶典的一部分(有兩個步驟):

rename abc "" abc* 
rename f.csv .csv *f.csv 

應該工作,因爲你要替換與空字符串 「ABC」 的一部分(即刪除abc部分)。使用重命名,您只需指定要替換的部分,而不是整個文件名(有關詳細信息,請參閱重命名手冊頁)。

第二步需要刪除尾部'f'。

對於DOS部分:

我不認爲你將能夠解決,只有重命名。看看Powershell的一些命令可能是值得的...

+0

好的,這聽起來很簡單,但在這種情況下,在YYMMDD之後我也希望同時刪除它。另外,我不需要用這些命令指定文件擴展名嗎? – stackmeistergeneral 2012-07-31 10:17:25

+0

不,你不需要指定文件擴展名:文件擴展名在系統下沒有固有含義(據我所知)。當然,您可以使用尾部擴展名通過glob模式進行過濾(如在第二次重命名調用中的最後一個命令行參數* f.csv中所做的那樣)。 – 2012-07-31 15:05:09

2

對於這個問題的 「DOS」 部分:假設你是在Windows上使用命令提示符(cmd.exe的),而不是真正的DOS中使用command.com

@echo off 
setlocal enableDelayedExpansion 
for %%F in (abc*f.csv) do (
    set "name=%%F" 
    ren "%%F" "!name:~1,6!.csv" 
) 


更新

REN如何使用通配符的規則可以在How does the Windows RENAME command interpret wildcards?找到。不幸的是,這些規則對這種情況沒有幫助。

+0

是的只是命令提示符,這工作謝謝!我不知道這個shell可能會比重命名更加痛苦。 – stackmeistergeneral 2012-07-31 15:18:19

0

我有一個DOS解決方案,你可以創建你需要在Excel中的字符串,然後複製並粘貼到命令行。它會自動執行你複製到命令行的每一行。

REN 「FOLDERPATH \文件名」, 「了newName」

REN "C:\Users\Charlie\Desktop\_Working General\L2795187.HH293.11.xml.csv" "HH293-11.csv" 

我創建的上述在Excel中的公式,只是貼入CMD。我想在列A中重命名每個單個文件的單元格,並且它工作得很完美。