2016-06-08 98 views
2

我想編寫一個簡單的bash腳本來將bash中的默認unix/linux查找程序包裝成多個匹配的文件。包裝bash查找命令

這是我的計劃命名爲my_find_command

#!/bin/bash 

patt="" 
first=true 
for i in "[email protected]"; do 
    if [ "$first" = true ]; then 
    patt="-name '$i'" 
    first=false 
    else 
    patt="${patt} -o -name '$i'" 
    fi 
done 

echo "$patt" 
find . -type f \(${patt} \) 
echo 'done' 

假設我有一些文件,該find命令將能夠恢復一些文件。

但是當我打電話my_find_command icon.png profile.png我什麼都沒有。

這裏出了什麼問題?

+0

你的腳本運行正常,我在Linux上,但你可能想要添加一個-a來獲得'find。 -type \($ patt \)'find的不同實現是挑剔的.... –

+0

您可以更簡單地編寫'for'循環:'for x; do patt =「$ patt $ {patt:+ -o} -name'$ x'」; done' –

回答

3

字符串內的行情做不是工作你想要他們的方式。你是正確的,./my_find_command icon.png不會找到icon.png。但是,它會發現'icon.png'。例如:

$ ls 
'icon.png' my_find_command 
$ ./my_find_command my_find_command icon.png 
-name 'my_find_command' -o -name 'icon.png' 
./'icon.png' 
done 

問題來自試圖將多個命令參數放入一個變量中。有關錯誤發生的完整說明,請參見 "I'm trying to put a command in a variable, but the complex cases always fail!"。相反,使用數組:

#!/bin/bash  
patt=() 
for i in "[email protected]"; do 
    if [ "${#patt}" -eq 0 ]; then 
     patt=(-name "$i") 
    else 
     patt+=(-o -name "$i") 
    fi 
done 

echo "${patt[@]}" 
find . -type f \("${patt[@]}" \) 
echo 'done' 

這現在打印正確的文件:

$ ls 
'icon.png' icon.png my_find_command 
$ ./my_find_command my_find_command icon.png 
-name my_find_command -o -name icon.png 
./icon.png 
./my_find_command 
done 

爲了證明通配符正常工作:

$ ls 
'icon.png' icon.png my_find_command 

$ ./my_find_command my_find_command '*icon.png*' 
-name my_find_command -o -name *icon.png* 
./icon.png 
./my_find_command 
./'icon.png' 
done