![如何在bash中找到未指定名称的文件?](https://linux22.com/image/61744/%E5%A6%82%E4%BD%95%E5%9C%A8bash%E4%B8%AD%E6%89%BE%E5%88%B0%E6%9C%AA%E6%8C%87%E5%AE%9A%E5%90%8D%E7%A7%B0%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F%20.png)
我有一个像这样的 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"
来保护空格,但星号消失了。
如果没有具有该名称的文件,这将失败,星号将保持原义(除非您设置nullglob
bash 选项)。如果那里有多个 txt 文件,这也将无法正常工作。然而,这总是有效的
for FILE in ../"$1"/*.txt; do whatever you want to do with `"$FILE"`; done