我想写一个简单的bash脚本来包装默认的unix / linux查找程序在bash中find匹配的多个文件。
这是我的程序名为my_find_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'
但是,当我打电话my_find_command icon.png profile.png我什么都没有。
Linux AWK的帮助。 有一个AWK的时间
Bash匿名pipe道
在Bash中做什么<()?
有没有办法看到一个path的所有中间目录的权限..?
这里出了什么问题?
通过BASH用下划线replace空格
如何在没有填充磁盘空间的情况下在tar归档文件中的grep模式
如果使用三通,如何检查退出?
bash脚本命令“陷阱”在docker容器中不起作用
字符串中的引号不会按照您希望的方式工作。 你是对的./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
问题来自于尝试将多个命令参数放入一个变量中。 有关错误发生方式的完整说明,请参阅“我试图将一个命令放入一个变量中,但复杂的情况总是失败!” 。 相反,使用一个数组:
#!/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