2016-06-08 103 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