文件名包含空格和通配符的变量

5

我收到的文件名包含空格,每周更换一次(文件名包含周数)

例如,本周的文件名为This is the file - w37.csv

我需要编写一个脚本来处理这个文件。 但我没能成功地编写出这个脚本。

如果我执行以下操作:

    $FILE="This is the file - w*.csv"

我找不到/dir/${FILE}

我尝试了"This\ is\ the\ file - w*.csv"

我还尝试了/dir/"${FILE}""/dir/${FILE}"

但是我仍然找不到我的文件

看起来文件名中的空格需要使用双引号将变量括起来,但这样通配符就不能被解析。

你有想法(或者答案)吗?

祝好,

Olivier

3个回答

5
echo /dir/"This is the file - w"*.csv

或者——你几乎尝试过那个——
echo /dir/This\ is\ the\ file\ -\ w*.csv

谢谢,但我的问题是在脚本中使用变量中的名称。 - Olivier Gérault
1
你想把它放在一个变量中吗?为什么?你可以将模式存储在变量中,然后根据需要进行扩展,或者你可以使用自定义分隔符来存储它,或者你可能想要将其存储在数组中。你打算用这个变量做什么? - Michael Krelin - hacker

3

使用bash数组

v=( /dir/This\ is\ the\ file - w*.csv )

如果确保只有一个匹配的文件,你可以直接展开$v。否则,你可以通过以下方式展开以获取完整匹配文件列表。
"${v[@]}"

或者使用个人匹配

"${v[0]", "${v[1]}", etc

哇,这解决了我的问题。谢谢。 我每周只收到一个文件,所以文件应该是唯一的,但我更喜欢做得好像我可能会收到多个文件。 - Olivier Gérault

1

首先,在赋值语句中不应使用美元符号。

此外,在赋值语句中不会调用通配符扩展。例如,您可以使用进程替换:

FILE=$(echo 'This is the file - w'*.csv)

请注意,通配符本身不包含在引号内。使用引号可以防止通配符扩展。

谢谢但这并没有解决我的问题。系统仍然尝试查找“/dir/This”,然后是“is”,然后是“the”,然后是“file”等等。 如果我设置为“/dir / $ {FILE}” ,那么回到开头,通配符将不会被扩展。 - Olivier Gérault
@OlivierGérault:在使用时双引号括起变量:ls /dir/"$FILE" - choroba
ls /dir/"$FILE" -> 没有这样的文件或目录。当然,该文件是存在的。 - Olivier Gérault
@OlivierGérault:对我来说可以用:touch 'a b c 23.csv' ; FILE=$(echo 'a b c '*.csv) ; ls ./"$FILE" - choroba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接