名称中带有 space 的文件夹无法识别

Folder with space in name not recognized

我对 Whosebug 和 bash/python 脚本编写还很陌生。

我需要调整一些 .tif 格式的数据地形模型文件 (300+) 的大小,以便能够将它们转换为 .hgt,我可以使用 gdal 工具完成这一切,但仅限于一次单个文件。 我猜您已经发现了脚本的用武之地:需要自动化 300 多个文件的流程!

所以我开始研究一下 bash 的工作原理并得出以下结论:

#!/bin/bash
for filename in "'/home/fenix/1\ Vari\ HDD/MTB/DTM\ Alos/'"*.tif; do
    PATH=/usr/bin/ gdalwarp -of Gtiff -ts 3601 3601 $filename.tif "'/home/fenix/1\ Vari\ HDD/MTB/DTM Alos/temp/'"$filename.tif
done

我总是使用反斜杠移动到 "spaced" 名称目录或文件,但似乎无法使用脚本....谷歌搜索我发现使用引号或双引号可以修复它但仍然没有成功

正如您在上面的代码中看到的那样,我单独使用了双引号、引号和反斜杠以及这 3 者的任意组合,但我总是得到

ERROR 4: '/home/fenix/1: No such file or directory

为什么?!?!

提前致谢,对不起我的英语!

编辑: 按照 tripleee golden 建议,我编辑了脚本,如:

#!/bin/bash
PATH=/usr/bin/
for filename in "/home/fenix/1 Vari HDD/MTB/DTM Alos/"*.tif; do
    gdalwarp -of Gtiff -ts 3601 3601 "$filename" "/home/fenix/1 Vari HDD/MTB/DTM Alos/temp/${filename##*/}"
done

工作起来很有魅力!

你过多的引用妨碍了你。

#!/bin/bash
for filename in "/home/fenix/1 Vari HDD/MTB/DTM Alos/"*.tif; do
    PATH=/usr/bin/ gdalwarp -of Gtiff -ts 3601 3601 "$filename" "${filename##*/}"
done

字符串/home/fenix/stuff with spaces可以表示为

/home/fenix/stuff\ with\ spaces
"/home/fenix/stuff with spaces"
'/home/fenix/stuff with spaces'

引号内的反斜杠或引号会产生文字反斜杠或引号,作为引号字符串的一部分。反斜杠反斜杠或引号类似地产生文字反斜杠或引号。

单引号更强;他们之间的一切都是字面上的。双引号允许变量和反引号扩展以及反斜杠引用。

所以 "'/home/fenix/1\ Vari\ HDD/MTB/DTM\ Alos/'" 指的是 ./'/home/fenix/1\ Vari\ HDD/MTB/DTM\ Alos/ ,这可能不是一个有效的路径,除非当前目录包含一个目录,其名称实际上是一个单引号,等等(我在前导./ 只是为了让这更明确)。

也许一个复杂的问题是引号抑制了通配符扩展;所以通配符 *.tif 需要不加引号。 (好吧,严格来说,只有通配符需要不加引号;*'.tif'*".tif"*\.\t\i\f 也可以。)

另请注意,$filename 的值是通配符每个扩展值的完整路径,没有删除目录前缀或扩展后缀或任何其他类似的魔法。我推测性地展示了如何将最后一个参数作为文件名传递,并删除了目录路径(参数替换 ${variable##pattern} 检索 variable 的值,任何前缀匹配 pattern 被删除)。因此输出文件应该位于当前目录中,与通配符匹配的 inp^t (希望然后在不同的目录中,这样你就不会最终覆盖你的输入文件)。

最后,观察我们如何始终在包含文件名的变量周围使用双引号。 (即使在一些相当流行的教程中,未能做到这一点也是一个常见错误。在您尝试处理具有不规则间距或字面星号等的文件名之前,该脚本似乎可以正常工作。)

古怪的 PATH 作业看起来也很奇怪。 gdalwarp 是否执行外部命令,你真的希望它只在 /usr/bin 中查找外部命令吗?或者您的意思是 运行 /usr/bin/gdalwarp(虽然在脚本开头设置正确的 PATH 可以说比硬编码特定的绝对路径名更好)。