2
#!/bin/bash
read nameArg
find -name "$nameArg"

使用此代码,例如当我输入 *.txt 时,它会给我所有以 txt 结尾的文件,但我只想要名称为 *.txt 的特定文件。如何使 bash 将 * 视为 * ?

直接在终端我知道我应该这样做:

find -name "\*.txt"

如何使它在脚本中工作?请注意,输入中并不总是有 *。

4

3 回答 3

3

您可以像这样即时逃脱 *:

find -name "${nameArg//\*/\\*}"

如果像 Ed 建议的那样,您可能想要一个更通用的解决方案,您可以使用 printf 的 %q 格式:

nameArg=$(printf '%q' "$nameArg")

或者如果您的 printf 支持它:

printf -v nameArg '%q' "$nameArg"
于 2013-04-01T20:24:45.290 回答
0

您应该在输入中转义*。如果您编写脚本来为您转义它们,您将失去提供包含*文字字符和元字符的输入的能力。例如,您将如何将模式\*.*(名称为*,具有任意扩展名)提供给自动引用脚本?

#!/bin/bash

read -r nameArg
find . -name "$nameArg"

然后在命令行上:

$ bash myscript.sh
> \*.txt
于 2013-04-01T20:38:50.223 回答
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 通配符。

于 2013-04-02T04:23:43.017 回答