2013-10-18 107 views
0

我明白如何遞歸搜索文件或目錄的層次結構,但無法弄清楚如何搜索層次結構並找到特定的目錄。通過目錄路徑搜索找到一個特定的目錄

給定一個路徑&文件如這些傢伙:

/Users/username/projects/project_name/lib/sub_dir/file.rb 
/Users/username/projects/project_name/lib/sub_dir/2nd_sub_dir/3rd_sub_dir/file.rb 
/Users/username/projects/project_name/spec/sub_dir/file.rb 

如何使用終端,我可以得到:

/Users/username/projects/project_name 

注:我知道,從project_name下一個目錄下是spec/lib/

+2

你究竟在做什麼*試圖完成什麼?當然有更好的辦法 - 但我們必須知道你爲什麼要這樣做。我有一種感覺,這將會變成一個[XY問題](http://www.perlmonks.org/?node_id=542341)。 –

+0

學習了新的'<! - language:none - >'謝謝:-) –

+2

所以你正在尋找文件路徑列表的共同祖先? – damienfrancois

回答

1

純粹的bash(沒有子進程產卵或其他命令)。根據你想要的靈活性,你可能需要考慮首先通過readlink -fn運行rootdir()函數的參數。解釋here

#!/bin/bash 

function rootdir { 
    local filename=$1 
    local parent=${filename%%/lib/*} 
    if [[ $filename == $parent ]]; then 
    parent=${filename%%/spec/*} 
    fi 
    echo $parent 
} 

# test: 
# rootdir /Users/username/projects/project_name/lib/sub_dir/file.rb 
# rootdir /Users/username/projects/project_name/spec/sub_dir/file.rb 
# rootdir /Users/username/projects/project_name/lib/sub_dir/2nd_sub_dir/3rd_sub_dir/file.rb 
# output: 
# /Users/username/projects/project_name 
# /Users/username/projects/project_name 
# /Users/username/projects/project_name 
+0

它的功能就像是一種魅力,但我正努力讓自己的頭部完全發揮它的作用。你能給我一個快速的簡要介紹。謝謝。 – dwkns

+0

http://www.tldp.org/LDP/abs/html/abs-guide.html#VARMATCH – bobah

0

您可以使用Perl:

cat file | perl -pe "s#(.+)(?:spec|lib).+#\1#" 

其中文件: /Users/username/projects/project_name/lib/sub_dir/file.rb /Users/username/projects/project_name/lib/sub_dir/2nd_sub_dir/3rd_sub_dir/file.rb /Users/username/projects/project_name/spec/sub_dir/file.rb

,或者您可以使用SED:

cat file | sed 's/\(^.*\)\(spec\|lib\).*/\1/' 
+0

問題是沒有*文件*只是一個文件 - 層次結構即沒有文件解析。 –