#!/bin/bash
read nameArg
find -name "$nameArg"
使用此代码,例如当我输入 *.txt 时,它会给我所有以 txt 结尾的文件,但我只想要名称为 *.txt 的特定文件。如何使 bash 将 * 视为 * ?
直接在终端我知道我应该这样做:
find -name "\*.txt"
如何使它在脚本中工作?请注意,输入中并不总是有 *。
#!/bin/bash
read nameArg
find -name "$nameArg"
使用此代码,例如当我输入 *.txt 时,它会给我所有以 txt 结尾的文件,但我只想要名称为 *.txt 的特定文件。如何使 bash 将 * 视为 * ?
直接在终端我知道我应该这样做:
find -name "\*.txt"
如何使它在脚本中工作?请注意,输入中并不总是有 *。
您可以像这样即时逃脱 *:
find -name "${nameArg//\*/\\*}"
如果像 Ed 建议的那样,您可能想要一个更通用的解决方案,您可以使用 printf 的 %q 格式:
nameArg=$(printf '%q' "$nameArg")
或者如果您的 printf 支持它:
printf -v nameArg '%q' "$nameArg"
您应该在输入中转义*
。如果您编写脚本来为您转义它们,您将失去提供包含*
文字字符和元字符的输入的能力。例如,您将如何将模式\*.*
(名称为*
,具有任意扩展名)提供给自动引用脚本?
#!/bin/bash
read -r nameArg
find . -name "$nameArg"
然后在命令行上:
$ bash myscript.sh
> \*.txt
不幸的是,您需要这样的东西来完全解决您的问题:
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 通配符。