這裏的基本問題是我想使用腳本來簡化使'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等等。
好吧,聽起來很誘人,但有一個問題 - 什麼是「轉變」?我認爲應該有一種方法來一次拉出一個參數,並用一種方式來引用剩下的東西,這聽起來就像那樣。只是不知道從列表中刪除1st的機制是什麼。 – JustJeff 2011-12-16 10:51:02
您可以在[Bash指南](http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_07.html)中找到有關`shift`的信息。 – jcollado 2011-12-16 13:17:55