#!/bin/bash
read nameArg
find -name "$nameArg"
当我输入例如* .txt的代码时,它会给我所有以txt结尾的文件,但我只想要名称为* .txt的特定文件。如何使bash处理*为*?
直接在终端我知道我应该这样做:
find -name "\*.txt"
如何让它在脚本中运行?请注意,输入中不会总是*。
答案 0 :(得分:3)
你可以像这样逃避*:
find -name "${nameArg//\*/\\*}"
如果像Ed建议的那样,你可能想要一个更通用的解决方案,你可以使用printf的%q格式:
nameArg=$(printf '%q' "$nameArg")
或者如果你的printf支持它:
printf -v nameArg '%q' "$nameArg"
答案 1 :(得分:0)
您应该在输入中转义*
。如果您编写脚本以逃避它们,则无法提供包含*
作为文字字符和元字符的输入。例如,您如何向自动引用脚本提供模式\*.*
(名称为*
,具有任意扩展名)?
#!/bin/bash
read -r nameArg
find . -name "$nameArg"
然后在命令行上:
$ bash myscript.sh
> \*.txt
答案 2 :(得分:0)
不幸的是,您需要这样的东西才能完全解决您的问题:
nameArg="$1"
find -print0 |
xargs -0 -L 1 awk -v n="$nameArg" 'BEGIN{f=ARGV[1]; sub(/.*\//,"",f); if (f==n"") print ARGV[1]; exit}' 2>/dev/null
即。首先查找所有文件,然后仅选择名称与目标字符串进行字符串比较的文件。
AFAIK没有办法告诉find
所以搜索字符串而不是模式,并且无法可靠地转义find
搜索模式中的shell globbing字符。