2012-07-02 31 views
2

我想要做的東西線:是否有內聯bash腳本這樣的事情?

find -name *.mk | xargs "for i in [email protected] do mv i i.aside end" 

我認識到,有可能比在此錯誤的更多,但我想具體瞭解這種內嵌命令定義的,我可以將xargs傳遞給。

+0

所以你要簡單地重命名所有的* .mk文件或其他什麼東西? – lynxlynxlynx

+0

你是什麼操作系統?至少Linux知道'rename'命令,查看http://linux.die.net/man/1/rename –

+0

你應該記住'find'和'xargs'確實與bash無關,它們是獨立的程式。他們不知道(或關心)bash命令。 – cdarke

回答

4

沒有必要在這裏xargs的

find -name *.mk -exec mv {} {}.aside \;

+0

問:「我該如何做X?」。答:「你不需要做X」 –

0

我不知道你的for循環的語義應該是什麼樣的,但一味地編碼它會給這樣的:

find -name *.mk | while read file 
    do 
    for i in $file; do mv $i $i.aside; done 
    done 

如果身體在多個地方使用,您還可以使用bash功能。

0

在某些版本找到一個論點需要。當前目錄

星*必須進行轉義

你可以用echo命令儘量肯定會做什麼命令

find . -name '*.mk' -print0 | xargs -0i sh -c "echo mv '{}' '{}.aside'" 
man xargs 
/-i 
man sh 
/-c 
0

我敢肯定,你可以在一個不錯的方式做到這一點,但因爲你要求xargs的:

find -name "*.tk" | xargs -I% mv % %.aside 

循環執行的文件名是沒有意義的,因爲你只能重新命名一次一個。使用內聯uglyness是沒有必要的,但我不能使它與管道,要麼evalbash -c工作。

3

這個特殊的命令是不是一個很好的例子,但您可以通過給sh -c 'here is the script'作爲一個命令使用「內聯shell腳本」。你可以給它的參數,這將是$ @裏面的腳本,但有一個問題:第一個參數here is the script去$ 0腳本中之後,所以你必須把附加字有,否則你會失去的第一個參數。

find . -name '*.mk' -exec sh -c 'for i; do mv "$i" "$i.aside"; done' fnord '{}' + 

另一個有趣的功能,我趁着還有一個事實,即循環遍歷命令行參數默認爲:for i; do ...相當於for i in "[email protected]"; do ...

我重申,上面的命令是令人費解和慢相比,到許多其他做批量MV的方法。我發佈它只是爲了顯示一些很酷的語法。

相關問題