如何在bash中找到未指定名称的文件?

如何在bash中找到未指定名称的文件?

我有一个像这样的 bash 可以轻松地将文件上传到我的服务器:

FILE=../"$1"/1.txt
scp 1.txt remoteserver #upload the file to a remote server.

$1 用于输入目录,我有很多目录。但所有这些目录中的txt文件并不都命名为“1.txt”。我可以确认的是,每个目录只包含一个txt文件。

在这种情况下如何找到该文件?

更新:

我尝试输入FILE=../"$1"/1.txt

但是当我用以下命令检查文件时:

if [ -f "$FILE" ]

我注意到即使文件存在它也会得到错误。

我发现:

$FILE../test/1.txt

"$FILE"../test/*.txt

那么我必须删除这对吗"

答案1

您可以使用通配符*来表示您不知道的名称。假设你设置了

FILE=../"$1"/*.txt

通配符扩展仅发生在引号之外。$FILE变量中仍然带有星号。所以,

[ -f "$FILE" ]

相当于

[ -f "../test/*.txt" ]

它需要在文件名中包含一个星号,但是

[ -f $FILE ]

相当于

[ -f ../test/*.txt ]

其得到扩展。

$FILE用于保存模式有点危险:如果您"$1"包含空格,则无法使其在带引号或不带引号的情况下工作:带引号将保留空格,但星号也会保留,但不带引号会在空格处拆分。您可以使用IFS,但在这种情况下,中间变量无论如何都不是最好的主意。

人们会对这种黑客行为感到畏缩,但如果没有病态的文件名,它就会起作用。您可以做的是,在将文件名保存到变量中之前强制扩展文件名。

FILE="$(echo ../"$1"/*.txt)"

现在,星号被替换为实际的文件名,稍后,您可以安全地使用引用的版本"$FILE"来保护空格,但星号消失了。

如果没有具有该名称的文件,这将失败,星号将保持原义(除非您设置nullglobbash 选项)。如果那里有多个 txt 文件,这也将无法正常工作。然而,这总是有效的

for FILE in ../"$1"/*.txt; do whatever you want to do with `"$FILE"`; done

相关内容