bash发现治疗*为*

时间:2013-04-01 20:15:16

标签: bash escaping special-characters

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

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

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

find -name "\*.txt"

如何让它在脚本中运行?请注意,输入中不会总是*。

3 个答案:

答案 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字符。