2016-12-21 42 views
0

在bash腳本我試圖用一個變量來用作find命令選項內容:如何在bash中使用變量的內容來在腳本中查找?

#!/bin/bash 
FILE_EXTENSIONS=(txt png jpg) 

FIRST=1 
for FILE_EXTENSION in ${FILE_EXTENSIONS[@]} 
do 
# echo "$FILE_EXTENSION" 
    if [[ $FIRST == 1 ]] 
    then 
     FIND_FILTER="-iname '*.$FILE_EXTENSION'" 
     FIRST=0 
    else 
     FIND_FILTER="${FIND_FILTER} -o -iname '*.$FILE_EXTENSION'" 
    fi 
done 
# Read and write only for user and group, ignore case '-iname' 
#find . -type f "$FIND_FILTER" -exec chmod 660 {} \; 
echo Find filter: $FIND_FILTER 
# This might work with some already provided suggestions: 
find . -type f $FIND_FILTER 
# But this fails so far 
find . -type f $FIND_FILTER -exec chmod 660 {} \;   
#EOF 

目的是設置適當的訪問權限爲什麼都相當理智一些文件(如圖片或辦公室文件)被標記爲可執行文件。

所以實際上上面的腳本有幾個文件擴展名連接的數組,但腳本顯示了這個問題。

第一種方法是遍歷最後一個數組,每次調用find。但從運行時的角度來看,每次反覆搜索都會很愚蠢。

我也可以簡單地在python中做這個,但有一次我以爲我想用bash中的linux基本方法解決它。

它看起來像FIND_FILTER變量的內容是正確的(至少是什麼打印與回聲),但然後...它不起作用。

有什麼建議發生了什麼問題?

回答

0

您開始正確使用數組(幾乎),但隨後將它們放棄爲空格分隔的字符串。繼續使用數組。

  1. 總是引用擴展的@索引數組;否則,沒有理由使用@而不是*
  2. 作爲一般規則,避免使用全大寫變量名稱;它們(大部分)保留用於shell。
  3. 將通過-o連接的過濾器放在轉義括號中,以便find將它們視爲除-type主要以外的單個條件。
  4. 使用-exec ... +這樣chmod可以在每次調用時對多個文件進行操作,而不是分別爲每個文件調用一次。

#!/bin/bash 
file_extensions=(txt png jpg) 

first=1 
for ext in "${file_extensions[@]}" 
do 
# echo "$ext" 
    if [[ $first == 1 ]] 
    then 
     find_filter=(-iname "*.$ext") 
     first=0 
    else 
     find_filter+=(-o -iname "*.$ext") 
    fi 
done 


# Read and write only for user and group, ignore case '-iname' 
find . -type f \("${find_filter[@]}" \) -exec chmod 660 + 
+0

@Benoit謝謝你清理我急匆匆寫的答案。 – chepner

+0

謝謝@chepner--拯救了我的一天。 我現在更清楚如何使用數組,並且最重要的是使用()以及需要引用它們的查找語法! – JDB

0

OK,我發現它爲什麼不工作

$ find . $FIND_ARGS &  # Does not work 
[1] 6312  
$ cat /proc/6312/cmdline 
find . -iname '*.png' 

$ find . -iname '*.png' & # Works 
[1] 8901 
$ cat /proc/8901/cmdline 
find . -iname *.png 

這樣的原因,調用命令時,直接報價只有那裏bash不能展開爭論。間接啓動命令時,必須刪除這些引號。

+0

感謝貝努瓦,我確認這適用於簡單的情況下(即使我不明白爲什麼)。但是,當我嘗試使用resut作爲'-exec chmod 660 {} \'的參數時,它失敗: 查找過濾器:-iname filter.txt -o -iname z.png -o -iname * .jpg 查找:未知謂詞'-iname * .txt -o -iname * .png -o -iname * .jpg' – JDB