簡體   English   中英

如何使用bash或Perl腳本遍歷目錄樹?

[英]How can I traverse a directory tree using a bash or Perl script?

我有興趣進入bash腳本,並想知道如何遍歷unix目錄並記錄當前正在查看的文件的路徑,如果它符合正則表達式標准。

它會是這樣的:

  • 遍歷大型unix目錄路徑文件/文件夾結構。
  • 如果當前文件的內容包含與一個或多個正則表達式匹配的字符串,
  • 然后將文件的完整路徑附加到結果文本文件。

Bash或Perl腳本很好,雖然我更喜歡你如何使用帶有grepawk等命令的bash腳本來實現這一點。

find . -type f -print0 | xargs -0 grep -l -E 'some_regexp' > /tmp/list.of.files

重要部分:

  • -type f使查找列表只有文件
  • -print0打印的文件不是由\\ n分隔,而是由\\ 0打印 - 這是為了確保它有效,以防你的名字中有空格的文件
  • xargs -0 - 在\\ 0上拆分輸入,並將每個元素作為參數傳遞給您提供的命令(在本例中為grep)

使用xargs的好處是,如果你的目錄包含很多文件,你可以通過並行來加速這個過程:

find . -type f -print0 | xargs -0 -P 5 -L 100 grep -l -E 'some_regexp' > /tmp/list.of.files

這將以5個單獨的副本運行grep命令,每個副本掃描另一組最多100個文件

使用find和grep

find . -exec grep -l -e 'myregex' {} \; >> outfile.txt

grep上的-l只獲取文件名

-e on the grep指定正則表達式

{}將find命令找到的每個文件放在grep命令的末尾

>> outfile.txt附加到文本文件

grep -l -R <regex> <location>應該完成這項工作。

如果你想在Perl中執行此操作,可以使用人們建議的find命令並將它們轉換為帶有find2perl的Perl腳本:

如果你有:

$ find ...

做那個

$ find2perl ...

這會輸出一個執行相同操作的Perl程序。 從那里開始,如果你需要在Perl中做一些簡單但在shell中很難的東西,你只需要擴展Perl程序。

find /path -type f -name "*.txt" | awk '
{
    while((getline line<$0)>0){
        if(line ~ /pattern/){
            print $0":"line
            #do some other things here
        }
    }    
}'

類似的線程

find /path -type f -name "outfile.txt" | awk '
{
    while((getline line<$0)>0){
        if(line ~ /pattern/){
            print $0":"line
        }
    }    
}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM