我有一系列带有标准化名称的压缩文件(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目录。我认为我很难用一个用星号定义的变量来完成,我并不完全理解它是什么。有人能帮助我吗?
谢谢。
答案 0 :(得分: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