2013-12-18 103 views
2

如何在具有此結構的文件名列表中刪除單詞「myfile」?從文件名中刪除模式

mywork_myfile_XSOP.txt 
mywork_myfile_ATTY.txt 
mywork_myfile_ATPY.txt 

Desired_output:

mywork_XSOP.txt 
mywork_ATTY.txt 
mywork_ATPY.txt  

回答

4

最簡單的方法是使用普通rename命令這在大多數Unix系統可用。

rename 's/^mywork_myfile_/mywork_/' * 

這當然期望你在文件的目錄。這不會覆蓋文件。如果你想要的話,只需通過-f選項。此外,請注意,有多個rename版本可能有不同的選項。

3

基於this answer的「重命名的所有文件 「在目錄中的所有文件重命名從$ filename_h至$ filename_half」,這可能是一個辦法:

for file in mywork_myfile*txt 
do 
    mv "$file" "${file/_myfile/}" 
done 

請注意,它使用bash字符串操作如下:

$ file="mywork_myfile_XSOP.txt" 
$ echo ${file/_myfile/} 
mywork_XSOP.txt 
+0

那麼,這*是最乾淨的方式。雖然它是特定於bash的,並且不會在其他shell中運行,即使其他posix風格的運行時也是如此,但這些日子可能還不錯。每個人都會運送禮物。 – DigitalRoss

+0

這個問題被標記爲'bash',所以我不擔心POSIX的兼容性。也就是說,一般來說,不能認爲'bash'是系統shell(Ubuntu)或者系統shell是當前版本的'bash'(Mac OS X)。 – chepner

+0

那麼,好點,實際上問題是*不*標籤bash。 – DigitalRoss

3

這在任何POSIX Shell的工作...

#!/bin/sh 
for i 
    in mywork_myfile_XSOP.txt \ 
    mywork_myfile_ATTY.txt \ 
    mywork_myfile_ATPY.txt; do 
     set -x 
     mv "$i" "$(echo $i | sed -e s/myfile_//)" 
     set +x 
done 
+0

好的一個。另請注意,通常建議使用'$()'而不是'''' – fedorqui

+0

'mv'的兩個參數也應引用。 – chepner