2014-10-02 30 views
0

我一直在成功運行,通過使用不能改變的是一個for循環,回聲文件名

for f in data/* do echo $f

打印出特定目錄中的文件的名稱的腳本結果的文件的名稱

當我運行它,它給了我:

data/data-1.txt data/data-2.txt data/data-3.txt(中數據目錄中的文件)

然而,當我需要的所有文件名的更改從數據 - * TXT至mydata-。 * txt,我無法想象它出。

我一直試圖使用sed s/data/mydata/g $f,但它會打印出整個文件,而不會正確更改名稱。任何人都可以給我一些關於如何更改文件名的提示嗎?它似乎也改變了目錄的名稱,如果我使用SED,所以我有點死衚衕。即使使用mv似乎也沒有做任何事情。

+0

也許這將是有益的:http://stackoverflow.com/questions/8899135/renaming-multiples-files -with-a-bash-loop – rsc 2014-10-02 05:47:09

回答

0
for f in data/* 
do 
    NewName="$(echo "${f}" | sed 's#/data-\([0-9]*.txt\)$#mydata\1#')" 
    if [ ! "${f}" = "${NewName}" ] 
    then 
    mv ${f} ${NewName} 
    fi 
done 

根據你的代碼,但很多其他的方式來做到這一點(例如:find -exec

+1

如果文件名包含空格或通配符,則將失敗。你應該總是用雙引號文件名。 'mv「$ f」「$ NewName」'(大括號是不必要的)。 – tripleee 2014-10-02 06:52:30

+0

對,它只是基於給定的文件夾和名稱中沒有空白處。確切地說,如果文件名稱內容2時間數據和一個數字(也超出範圍),它也失敗了。再一次你是對的,「un」大括號是可選的,我養成習慣總是使用大腳本的大括號。你有你的觀點;-) – NeronLeVelu 2014-10-02 07:44:17