2011-12-16 33 views
0

這裏的基本問題是我想使用腳本來簡化使'find'實用程序跳過某個麻煩的目錄。bash腳本設置'查找'實用程序的參數問題

Bash腳本不是我的強大套件。我被困在如何在命令行上獲取帶引號的通配符文件規範到腳本中,然後從那裏進入未命中的find命令。看起來像bash喜歡撕掉東西的引號,並將包含通配符的單詞擴展爲單詞列表,這通常很棒,但是當我嘗試評估腳本中的「查找」時,此命令行烹飪發生兩次,結果不理想。

現在我要給出血淋淋的細節,也許有人會看到我真的想做什麼,並說'嘿,你知道有一個更簡單的方法來完成這個'。圍繞這個問題的最終解決方案對我來說很好。

所以,後臺 -

對有問題的機器,有一個自動備份系統,對某些目錄的二十幾快照,比如用戶的主目錄和各個項目地點的檔案。因此,在我的主目錄中,我有〜/ .backup/hourly.0,〜/ .backup/hourly.1等等,大約每小時12分鐘,然後每晚1分鐘到晚上12分鐘,所以存在巨大的重複。通常這是一個很好的安全網,直到我想在我的主目錄中找到某個東西。

例如,假設我想查找所有* .foo文件;簡單的解決方案是發行

find ~ -name "*.foo" 

..除了在這臺機器上,找到開始篩選所有這些備份目錄。通常我不會對.backup目錄中的命中感興趣。搜索它們很慢,而且我知道它們是網絡掛載的,我正在融化某人的數據。所以接下來的發展做一些與窗體像這樣

find ~ ! \(-name .backup -prune \) -a -name "*.foo" 

..這工作的,是不是太糟糕,如果只需要使用一次或兩次。但是很容易發胖,並且在需要連續多次需要時會變得煩人。所以,寫一個腳本來處理這個問題似乎是個好主意。由於缺乏更富有想象力的名字,我們使用'findx'。這個想法是發佈findx〜-name「* .foo」,並且讓'findx'自動將其轉換爲更復雜的形式。在腳本的第一個破解這個樣子

find $1 ! \(-name .backup -prune \) $2 $3 $4 $5 $6 $7 

誠然,這是非常kludgey看,並不會爲有太多的參數搜索工作。 (如果有一種方法可以指定'從第二個參數開始的所有參數',我不知道它。)find命令的特殊語法似乎決定將$ 1從其餘參數分開,b/c搜索根目錄位置必須先行,並且-prune和-print子句在倒序時不能正確工作,所以--prune必須在(隱式)打印的東西之前出現,並在右側留下$ 2 $ 3等。無論如何,它應該足以進行簡單的搜索。

嗯,這似乎對特定的文件名工作正常,但通配符把它關閉。看來,如果,例如,我餵它

findx . -name "*stuff" 

是來砸第一傳遞到腳本到$ params的一個前去掉引號關*的東西。然後構建的find命令不包含引用通配符的引號;所以當得到執行時,shell然後在執行find之前擴展*,然後扼住,b/c找到想要的單詞*東西而不是它擴展到的列表。 (顯然發現喜歡做自己的通配符擴展?)

那麼 - 有沒有辦法讓這項工作?有沒有其他的方法可以省略搜索不僅僅是如此噁心的目錄,從而避免了腳本的動機?找到的替代方法,可以完成大部分查找操作,例如-ctime,-type,-name等等。

回答

3

如果有辦法指定'從第二個開始的所有參數',我不知道它。

這是"${@:2}",如:

find "$1" ! \(-name .backup -prune \) "${@:2}" 

The Bash Reference Manual是有點密集讀取的,但它確實說明這種行爲,如果你知道去哪裏找。具體而言,在§ 3.5.3殼牌參數擴展,在${parameter:offset}${parameter:offset:length}的描述中,提到了「如果參數是‘@’,結果是長度開始位置參數偏移」,後來其「除非使用位置參數,否則子串索引是基於零的,在這種情況下,默認情況下索引從1開始。」

2

不是一個完整的答案,但看着ABS Guide,我看到了一些有趣的事情。

$ @

與$ *,但是每個參數是一個帶引號的字符串,那就是,參數傳遞完整,沒有解釋或擴展。這意味着,除其他外,參數列表中的每個參數都被視爲一個單獨的單詞。

這可能對通配符擴展問題有用。

轉換後,$ @保留了其餘的命令行參數,缺少之前的$ 1,而這些參數已丟失。

而這種方式來指定從第二個開始的所有參數。

我希望這會有所幫助。

+0

好吧,聽起來很誘人,但有一個問題 - 什麼是「轉變」?我認爲應該有一種方法來一次拉出一個參數,並用一種​​方式來引用剩下的東西,這聽起來就像那樣。只是不知道從列表中刪除1st的機制是什麼。 – JustJeff 2011-12-16 10:51:02

+0

您可以在[Bash指南](http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_07.html)中找到有關`shift`的信息。 – jcollado 2011-12-16 13:17:55