2014-03-27 83 views
0

我有一個很大的目錄結構,其中包含許多名爲「configuration.txt」的文件。對於在其路徑某處具有目錄「n10」的每個configuration.txt實例(並且此特定目錄有許多這樣的實例),我想要執行搜索和替換,其中字符串「DNSMax = 20「替換爲字符串」DNSMax = 50「。在Bash Shell中編輯文件的腳本

請注意,我的路徑名稱中包含空格。

可能有人請給予的Bash shell腳本,如果從我大的目錄結構的根調用,將完成這項任務?

我正在使用RedHat Linux。

謝謝!

+0

這不是我的downvote,但我動心。你應該知道,不用提出你曾經試過的問題就可以提出問題。你有什麼想法?哪個命令查找符合某些標準的文件?你考慮過哪些編輯工具? –

+0

我已經嘗試過各種find,grep,sed,xargs和backquoting命令的組合來完成這個任務。幾天前我做了這些嘗試,我不記得我嘗試過的所有組合以及相應的結果。無論我發現什麼都行不通,社區中有人知道如何輕鬆完成這項任務。 – Dave

+0

這聽起來像你需要一個配置管理系統。 – chepner

回答

3

使用find和GNU sed

find/-path '*/n10/*' -name configuration.txt \ 
     -exec sed -i 's/DNSMax=20/DNSMax=50/' {} \; 
+1

這是我非常非常尷尬的部分。 +1。 –

+0

...說,這應該使用一個免責聲明,它需要GNU查找和sed,因爲'-i'對於sed是非標準的,因爲'-path'用於查找。 –

+0

但是由於系統是明確的RedHat Linux,所以GNU'find'和'sed'很可能是常駐命令 - 儘管我同意應該說明警告,以防有人試用它,比如AIX或Solaris,而且它不會工作。 '\;'應該用'+'替換以實現'xargs'效果(一個'sed'命令適用於許多文件)。 –

0

如果在完整文件路徑之間沒有空格,這將工作。

find . -name "configuration.txt"|grep '\/n10\/'|xargs perl -pi -e 's/DNSMax=20/DNSMax=50/' 
+0

爲什麼'grep'中的反斜槓?那名字裏有空格的目錄路徑呢? –

+0

嗯。使用perl對我的答案是一個改進,使用NUL分隔的文件名是退一步的(因爲有效的UNIX文件名可以包含'$'\ n')。 –

+0

@JonathanLeffler,我不確定空格是一個問題。當然,換行符是。 –