2013-11-21 35 views
1

我沒有在Bash中每天編碼。我試圖實現小功能:用戶在find命令中定義要省略的目錄或文件數組。不幸的是,我在shell中擴展星號和其他元字符時遇到了問題(*在連接時被擴展)。我的代碼是:不擴展星號的shell - 不包括髮現的路徑

excluded=("subdirectory/a/*" 
     "subdirectory/b/*" 
     ) 

cnt=0 
for i in "${excluded[@]}"; do 
    directories="$directories ! -path \"./${excluded[$cnt]}\"" 
    cnt=$(($cnt+1)) 
done 
echo "$directories" 

for i in $(find . -type f -name "*.txt" $directories); do 
    new_path=$(echo "$i"|sed "s/\.\//..\/up\//g") 
    echo $new_path 
done 

不幸的是,我仍然在結果中看到排除的目錄。

編輯:

這不是重複現有的問題。我不問你如何排除find中的目錄。通過傳遞變量來查找命令,擴展元字符(如「*」)時遇到問題。下面E.g我幾乎工作液:

excluded=("subdirectory/a/*" 
      "subdirectory/b/*" 
      ) 

cnt=0 
for i in "${excluded[@]}"; do 
    directories="$directories ! -path ./${excluded[$cnt]}" 
    cnt=$(($cnt+1)) 
done 
echo "$directories" 

for i in $(find . -type f -name "*.txt" $directories); do 
    new_path=$(echo "$i"|sed "s/\.\//..\/up\//g") 
    echo $new_path 
done 

它的工作原理,但問題是,當e.g目錄c包含多個文件。在這種情況下,星號被完整文件路徑替代。因此我有一個錯誤:

find: paths must precede expression: ./subdirectory/c/fgo.txt 
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] 

爲什麼?因爲星號sgin已經擴展到完整的文件名:

! -path ./subdirectory/a/aaa.txt ! -path ./subdirectory/b/dfdji.txt ! -path ./subdirectory/c/asd.txt ./subdirectory/c/fgo.txt 

我的問題是:如何避免這種情況呢?

+0

[可從find中排除目錄。命令](http://stackoverflow.com/questions/4210042/exclude-directory-from-find-command) – ffledgling

+0

不是。我詢問避免星號擴展,而不是查找語法 - 請參閱我的編輯 – Viper

回答

1

你會想要在find中使用-prune開關。

下面是一個例子(我發現這個計算器上本身)

find . -type d \(-path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print 

此省略,dir1dir2dir3

來源:https://stackoverflow.com/a/4210072/1220089

0

我最初的想法是使用雙引號來防止膨脹:

for i in $(find . -type f -name "*.txt" "$directories" | sed '[email protected]\./@\.\./up/@g'); do 

但本課程的失敗。您可以使用(未​​經測試)完成相同的效果:

pre='! -path' 
excluded=("$pre subdirectory/a/*" 
      "$pre subdirectory/b/*" 
      ) 

for i in $(find . -type f -name "*.txt" "${excluded[@]}" | sed ...); do