2017-04-15 79 views
0

我已經編寫了一個腳本(foo),它可以在輸入文件中對文本進行簡單的sed替換。我有一個包含大量子目錄(a/b1,a/b2等)的目錄(a),它們都具有相同的子目錄(c等),幷包含一個具有相同名稱(d)的文件。所以粗略的結構是:在所有子目錄中的特定文件上運行腳本

a/ 
-b1/ 
--c/ 
---d 
-b2/ 
--c/ 
---d 
-b3/ 
--c/ 
---d 

我想在樹中的每個文件(d)上運行我的腳本。不幸的是,以下不起作用:

sudo sh foo a/*/c/d 

如何在bash命令中使用通配符?我是否必須使用find以及特定的max和mindepth,還是有更優雅的解決方案?

+1

事實上,貌似找到的是你的朋友 – ashawley

+0

你使用'sh'或'bash'? – Cyrus

+0

如果你的bash版本支持,你可以設置'shopt -s globstar',然後嘗試'ls **/d',如果它匹配你所需要的...比你可以使用'sudo sh foo **/d' ..看到[this](http://mywiki.wooledge.org/glob#globstar_.28since_bash_4.0-alpha.29)瞭解更多信息...還請注意'sh'可能與'bash'不一樣 – Sundeep

回答

0

在您的示例中的通配符擴展應該工作,並且不應該需要查找。我假設b和c只是一些通用文件名來簡化問題。你的文件夾/文件是否包含空格?

如果你這樣做:

ls -l a/*/d/c 

你得到你需要列出的文件?如果是這樣,那麼它是如何處理腳本文件中的$*。介意與我們分享?

正如你所看到的,通配符擴建工程

$ ls -l a/*/c/d 
-rw-r--r-- 1 user wheel 0 15 Apr 08:05 a/b1/c/d 
-rw-r--r-- 1 user wheel 0 15 Apr 08:05 a/b2/c/d 
-rw-r--r-- 1 user wheel 0 15 Apr 08:05 a/b3/c/d 
+0

所以,謝謝!在我的腳本中,我只使用$ 1,所以只處理列表中的第一個文件。將它改爲$ @的確有竅門。這是最後的腳本:'#!/ bin/sh if [「$ 1」!=「」];然後 文件名= $ @ 否則 文件名= 「./ d」 網絡 sed的-i '' $ filenames' – UStralian

相關問題