2012-09-29 52 views
0

我用find命令找到了幾個文件。 的文件是型file_sakfksanf.txt,file_afsjnanfs.pdf,file_afsnjnjans.cpp的, 現在我想將它們與重命名和-exec命令重命名爲 mywish_sakfksanf.txt,mywish_afsjnanfs.pdf,mywish_afsnjnjans.cpp 只有第一個前綴被改變。我想嘗試一段時間,所以不要責怪我愚蠢。用find找回

+0

如果您創建一個腳本來重命名一個文件,然後可以使用該腳本與查找。 –

+3

我們從不指責別人愚蠢。也許懶惰,但從不愚蠢。你有什麼嘗試? –

+1

@MarkReed:+1搞笑:) –

回答

5

如果你讀通過man頁面的-exec部分find您將遇到{}字符串,該字符串允許您將匹配用作參數-exec中的參數。這將允許你使用你的find比賽rename以下列方式:

find . -name 'file_*' -exec rename 's/file_/mywish_/' {} \; 

從手冊:

-exec 命令;

執行命令;如果返回0狀態,則返回true。所有跟在 之後的參數將被作爲命令的參數,直到由;' is encountered. The string {}'構成的參數 被替換爲 被當前文件名正在被處理的任何地方發生在該命令的參數 參數中,而不僅僅是在參數中它是單獨的,因爲 在某些版本的查找。這兩個構造可能需要 被轉義(用'\')或引用來保護它們免於通過shell來擴展 。有關使用 -exec選項的示例,請參閱EXAMPLES部分。指定的命令對每個匹配的文件運行一次。該命令在起始目錄中執行。有 不可避免的圍繞使用-exec動作的安全問題; 您應該改用-execdir選項。

雖然你問一個查找/ Exec解決方案,爲Mark Reed建議,你可能要考慮你的管道結果xargs。如果這樣做,請確保將-print0選項與find以及-0-null選項與xargs配合使用,以避免由文件名中出現的空白或shell元字符造成的意外行爲。此外,考慮使用+版本的-exec(手動也),因爲這是find的POSIX規範,因此應更便攜,如果你想在其他地方(不總是真)運行命令;它也以類似於xargs的方式構建其命令行,這將導致調用rename的次數減少。

+0

這將是更有效地使用是'xargs'或'+'選項的'找到-exec':'找到。 -name'file_ *'-exec rename's/file_/mywish_ /'{} +'然後它只運行重命名一次或幾次,而不是每個文件一次。此外,這是假設一個特定的重命名命令語法,這是依賴於系統;這可能是'重命名_文件mywish_'而不是'命名的/ _文件/ mywish _ /'' –

+0

@MarkReed:的'+'版和'xargs'替代包括提。我確定OP可以修改'rename'語法以符合他們自己的系統,如果他們需要的話。 – tojrobinson

0

不要以爲有一種方法,你可以這樣做只是覺得,你需要創建一個腳本:

#!/bin/bash 
NEW=`echo $1 | sed -e 's/file_/mywish_/'` 
mv $1 ${NEW} 

然後,您可以:

find ./ -name 'file_*' -exec my_script {} \;