2013-02-21 60 views
8

這應該是相對平凡的,但我一直在嘗試一段時間沒有太多的運氣。 我有一個目錄,有許多目錄,每個目錄都有自己的結構和文件。查找文件,在地方重命名unix bash

我正在尋找工作目錄下的任何目錄下的所有.java文件,並將它們重命名爲特定名稱。 例如,我想命名所有的java文件「test.java」。

如果目錄結構是:

./files/abc/src/abc.java 
./files/eee/src/foo.java 
./files/roo/src/jam.java 

我想簡單地重命名爲:

./files/abc/src/test.java 
./files/eee/src/test.java 
./files/roo/src/test.java 

當然,我的問題的一部分是,路徑可能有空格 我不要。無需擔心重命名類或文件內的任何內容,只需要指定文件名即可。

如果目錄中有超過1個.java文件,我不介意它是否被覆蓋或提示選擇要做什麼(可以,不可能有超過1個在

我已經試過每個目錄:

展望MV,並找到,但是當我管他們在一起我似乎是做錯了,我想一定要保持他們在他們的當前位置和重命名,而不是移動。

謝謝,我真的很感謝任何幫助,

回答

21

find的GNU版本有一個-execdir操作,它將目錄更改爲文件所在的位置。

find . -name '*.java' -exec bash -c 'mv "$1" "${1%/*}"/test.java' -- {} \; 
+0

我應該如何讀取''$ {1%/ *}「/ test.java'位? – dumbledad 2017-11-07 15:21:55

+1

變量'$ 1','%'刪除最短的匹配後綴'/ *' - 它將從'$ 1'中刪除文件名,就像'dirname「$ 1」'會做的那樣。 '/ test.java'附加到該目錄名稱。 – 2017-11-07 15:24:46

5

如果您find指令(像我)不支持-execdir,請嘗試以下操作:

find . -name '*.java' -execdir mv {} test.java \; 

如果你的的find版本不支持-execdir,那麼你可以把工作做用:

find . -name "*.java" -exec bash -c 'mv "{}" "$(dirname "{}")"/test.java' \; 
+0

這對帶有引號的文件名更爲安全:'-exec bash -c'mv「$ 1」$(dirname「$ 1」)/ test.java' - {} \;' – 2013-02-21 16:28:48