2014-05-15 39 views
2

使用GNU查找,我可以使用-maxdepth選項來指定搜索文件的特定深度。不幸的是,我的命令需要在HP-UX,AIX和Solaris上運行,並且不支持-maxdepth選項。跨平臺shell腳本查找所有文件到maxdepth

我發現我可以運行find /some/path/* -prune以僅獲取單個文件夾中的文件,但我想遞減n個級別,就像-maxdepth參數允許的一樣。這可以通過跨平臺的方式完成嗎?

編輯:我發現我可以使用-path選項做一個類似的過濾器,像這樣

find ./ ! -path "./*/**" 

不幸的是,AIX發現不支持-path選項。我至少有點接近。

+0

是否有任何理由不在所有三個操作系統上安裝GNU find軟件包? –

+0

該命令不需要任何Linux,HP-UP,AIX和Solaris機器上的任何工作。在生產中,我將無法訪問這些機器。我願意使用一些工具,而不是在這些系統上默認安裝它,但接下來還有其他要求,因爲我的真正查找命令比我的問題要長。 – ben

+0

我應該補充一點,如果需要,我可以在每個系統上使用不同的命令,但通用的是首選。 – ben

回答

0

這可能不是最高性能的解決方案,但它應該非常便攜。除了OSX和Linux之外,我還在Solaris上測試了它。本質上,它是一個遞歸的樹行走深度 - 首先使用ls。隨意調整和消毒,以滿足您的需求。希望它也可以在AIX上運行。

#!/bin/bash 

path="$(echo $1 | sed -e 's%/*$%%')" # remove trailing spaces 
maxDepth="$2"       # maximum search depth 
currDepth="$3"       # current depth 

[ -z $currDepth ] && currDepth=0  # initialize 

[ $currDepth -lt $maxDepth ] && {  # are we allowed to go deeper 
    echo "D: \"$path\""     # show where we are 
    IFS=$'\n'       # split the "ls" output by newlines instead of spaces 
    for entry in $(ls -F "$path"); done # scan directory 
     [ -d "$path/$entry" ] && {  # recursively descent if it is a child directory 
      $0 "$path/$entry" $maxDepth $((currDepth+1)) 
      continue 
     } 
     echo "F: \"$path/$entry\""  # show it if it is not a directory (symink, file, whatever) 
    done 
}