包装bash查找命令

时间:2016-06-08 04:05:30

标签: linux bash macos shell

我想编写一个简单的bash脚本来包装bash中的默认unix / linux查找程序,以找到匹配的多个文件。

这是我的名为#!/bin/bash patt="" first=true for i in "$@"; 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命令可以返回某些文件的文件。

但是当我打电话给{{1}}时,我什么也没得到。

这里出了什么问题?。

1 个答案:

答案 0 :(得分: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 "$@"; 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