2011-09-28 188 views
1

我需要遍歷一個目錄,以便從一個目錄開始,並深入到不同的子目錄中。不過,我也需要能夠訪問每個單獨的文件來修改文件。是否已有命令執行此操作,還是必須編寫腳本?有人可以提供一些代碼來幫助我完成這項任務嗎?謝謝。Unix:遍歷一個目錄

+0

什麼是遍歷的目的是什麼? – Orbling

回答

1

您通常會使用find命令。在Linux上,當然你有GNU版本。它有很多額外的(和有用的)選項。兩者都將允許您在找到文件時執行命令(例如shell腳本)。

如何對文件進行更改的具體細節取決於您要對文件所做的更改。這可能是最好的劇本,與find運行腳本:

POSIX或GNU:

find . -type f -exec your_script '{}' + 

這將再次運行腳本,針對一組作爲參數提供的名稱的文件。如果要一次執行一個文件,請將+替換爲​​3210(或\;)。

5

find命令只是它的工具。它的-exec標誌或-print0與xargs -0的組合允許對每個文件做什麼的細粒度控制。

示例:在/ tmp和子目錄中的所有文件中,用條的全部foo替換。

find /tmp -type f -exec sed -i -e 's/foo/bar/' '{}' ';' 
+0

你能提供一個代碼示例嗎?謝謝! –

+0

有關其他詳細信息,請參見[本頁](http://ss64.com/bash) –

+0

@thiton使用'sed'您不會以交互方式訪問這些文件。我不認爲這是@EricAnderson正在尋找的東西。 – ztank1013

2
for i in `find` ; do 
    if [ -d $i ] ; then do something with a directory ; fi 
    if [ -f $i ] ; then do something with a file etc. ; fi 
done 

這會在當前目錄返回整個樹(遞歸)的列表,循環會經過。

+3

不錯的例子,但如果在文件名或目錄名稱中有特殊字符(如空格)則不安全。 – bot403

+0

+1同意。還有更多的東西(錯誤處理)。我試圖說明find的行爲。 – long404

2

這可以很容易地通過混合find,xargs,sed(或其他文件修改命令)來實現。

例如: $ find /path/to/base/dir -type f -name '*.properties' | xargs sed -ie '/^#/d'

這將過濾所有的文件與文件擴展名.propertiesxargs命令會將find命令生成的file path送入sed命令。 sed命令將刪除文件中的所有以#開頭的行(由xargs供稿)。

這種方式的命令組合非常靈活。

例如,find命令具有不同的參數,因此您可以按用戶名,文件大小,文件路徑(例如:在/ test /子文件夾下),文件修改時間進行過濾。

靈活性的另一個方面是如何以及如何更改文件。例如,sed命令允許您在應用替換時對文件進行更改(通過正則表達式指定)。同樣,您可以使用gzip來壓縮文件。等等...

0

我假設SearchMe是您需要完整遍歷的示例目錄名稱。
我也假設,因爲它沒有指定,你想修改的文件都是文本文件。它是否正確?

在這種情況下,我建議使用下面的命令:

find SearchMe -type f -exec vi {} \; 

如果你不熟悉vi編輯器,只需使用另一個(nanoemacskatekwritegedit等),它應該也能工作。

0

擊4+

shopt -s globstar 
for file in ** 
do 
    if [ -f "$file" ];then 
     # do some processing to your file here 
     # where the find command can't do conveniently   
    fi 
done