Linux 包装bash-find命令

Linux 包装bash-find命令,linux,bash,macos,shell,Linux,Bash,Macos,Shell,我想编写一个简单的bash脚本,将默认的unix/linux find程序包装到bash中,以查找多个匹配的文件 这是我的程序名为my\u find\u command: #!/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

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

这是我的程序名为
my\u find\u command

#!/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
时,我什么也没有得到


这里出了什么问题?

字符串中的引号不能按您希望的方式工作。您认为
/my\u find\u命令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
问题来自于试图在一个变量中放入多个命令参数。有关此错误方式的完整解释,请参阅。相反,请使用数组:

#!/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

您的脚本在Linux上按预期运行,但您可能希望添加-a以获取
find-键入f-a \($patt\)
find的不同实现都很挑剔……您可以将
for
循环更简单地写为:
for x;do patt=“$patt${patt:+-o}-name'$x';完成