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

时间:2019-02-10 12:16:35

标签: bash directory space

我对stackoverflow和bash / python脚本非常陌生。

我需要调整.tif格式的某些Data Terrain Model文件(300+)的大小,以便能够将'em转换为.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

我一直使用反斜杠移动到“分隔的”名称目录或文件中,但似乎无法使用脚本。...使用引号或双引号进行谷歌搜索会解决此问题,但仍然没有成功

如您在上面的代码中所见,我只使用了双引号,引号和反斜杠以及这三个的任意组合,但我总是得到

  

错误4:'/ home / fenix / 1:没有这样的文件或目录

为什么?!?!

预先感谢,对不起我的英语!

编辑: 遵循三元组的金色建议,我将脚本编辑为:

#!/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

像魅力一样工作!

1 个答案:

答案 0 :(得分:1)

您过多的报价已成问题。

#!/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/,这可能不是有效的路径,除非当前目录包含名称实际上是单引号的目录,等等(我放在前导{{ 1}}只是为了使其更加明确)。

一个复杂的情况是引号禁止通配符扩展;因此通配符./需要取消引用。 (严格来说,只有通配符需要被取消引用; *.tif*'.tif'*".tif"也会起作用。)

还请注意,*\.\t\i\f的值是通配符每个扩展值的完整路径,没有修剪掉目录前缀或扩展名后缀或任何其他类似的魔术。我已经推测性地展示了如何传递最后一个参数作为修剪路径目录的文件名(参数替换$filename检索${variable##pattern}的值,修剪任何匹配variable的前缀)。因此,输出文件应该放在当前目录中,并且通配符匹配中的inp ^ t(希望然后在另一个目录中,因此您最终不会覆盖输入文件)。

最后,观察我们如何注意始终对包含文件名的变量使用双引号。 (即使在某些相当流行的教程中,也未能做到这一点。在您尝试使用不规则间距或文字星号等文件名之前,该脚本将一直有效。)

古怪的pattern分配也看起来很奇怪。 PATH是否执行外部命令,然后您真的希望它仅在gdalwarp中查找外部命令吗?也许您的意思是运行/usr/bin(尽管在脚本开始处设置正确的/usr/bin/gdalwarp可能比硬编码特定的绝对路径名更好)。