1

我有一系列具有标准化名称的压缩文件(file1pop.zip、...、filenpop.zip)。在每个文件中,我都有一个感兴趣的文件 popdnamei.asc,其中 i={1,n}。我想对这些文件执行两个命令(其中将 asc 文件转换为 tif)。但是,我无法让我的 bash 脚本工作。我想我没有正确理解如何在 bash 上截断字符串。有人知道这是我的错误吗?

################### 
##  Choose path
###################
cd 
cd path/to/my/directory/with/zipfiles

###################
##  Unzip, convert to tif and project (WGS84)
###################

for x in *pop.zip
do
echo $x
files=${x%%.*}  #with this I hope to target the base name "filei", i={1,n} without the ".zip" extension
mkdir $files
    unzip -d $files  $x
y=popd*.asc  
if [ -f $files/$y ]  #with this I want to run my commands only if the file popdnamei.asc does exist in the file
then
        newy=${y%%.*}   #extract "popdnamei" without ".asc" extension
        gdal_translate $files/$y $files/$newy.tif  #command 1
        gdalwarp -s_srs "WGS84" -t_srs "WGS84" $files/$newy.tif $files/$newy_PROJ.tif  #command 2
        cp $files/$newy_PROJ.tif ../Output_Storage/ 
fi
rm -rf $files
done    

我想我对变量有问题$y。我在程序运行时进行了检查,输出文件的字面意思是newypopd*.tif用星号命名为“”,而不是用“完成”的名称 ( popdnamei.tif) 命名。此外,没有文件写入我的 Output_Storage 目录。我想我在切割一个用星号定义的变量来完成时遇到了麻烦,而且我不完全理解它是什么。有人可以帮助我吗?谢谢你。

4

1 回答 1

2

问题在于声明

 y=pop*.asc

bash 文件名扩展功能尝试查找给定文件名模式的匹配项。如果未找到匹配项,则将提供的模式分配给变量。在您的情况下,解压缩的 pop*.asc 文件位于子文件夹 $files 中,因此找不到匹配项,并且模式本身被分配给变量“y”。

我建议有另一个内部循环来迭代解压缩的文件。

for y in $files/pop*.asc; 
do
        if [ -f $y ]
        then 
            newy=${y%%.*}   #extract "popdnamei" without ".asc" extension
            gdal_translate $y $newy.tif  #command 1
            gdalwarp -s_srs "WGS84" -t_srs "WGS84" $newy.tif $newy_PROJ.tif  #command 2
            cp $newy_PROJ.tif ../Output_Storage/ 
        fi
done
于 2013-11-26T16:44:27.823 回答