我正在尝试使用序列选择文件列表中的元素。为此,我按照文件夹中的模式创建了所有文件的列表:
ls -d -1 /my/path/S1*.zip
输出在哪里:
/my/path/S1A_IW_SLC__1SDV_20180412T171648_20180412T171715_021437_024E95_BDA1.zip
/my/path/S1A_IW_SLC__1SDV_20180424T171648_20180424T171715_021612_02540A_BB21.zip
/my/path/S1A_IW_SLC__1SDV_20180506T171649_20180506T171716_021787_025996_98AB.zip
/my/path/S1A_IW_SLC__1SDV_20180518T171649_20180518T171716_021962_025F27_A15C.zip
/my/path/S1A_IW_SLC__1SDV_20180530T171650_20180530T171717_022137_0264C8_5D94.zip
/my/path/S1A_IW_SLC__1SDV_20180611T171651_20180611T171718_022312_026A3D_BBFC.zip
/my/path/S1A_IW_SLC__1SDV_20180623T171652_20180623T171719_022487_026F7C_450E.zip
/my/path/S1A_IW_SLC__1SDV_20180623T171652_20180623T171719_543456_64324F_452W.zip
我想创建一个for
循环,在该循环中,对于每次迭代,文件都以两个为一组进行处理。因此,在第一次迭代中,我的列表中位置 1 中的文件和位置 2 中的文件被处理。在第二次交互中,在位置 3 中归档,在位置 4 中归档,依此类推。
为了简单起见,我将以解压缩这些文件的示例为例:
for i in $(ls -d -1 /shared/Training/WROC0320_UrbanMapping_Germany/Original/S1*.zip)
do
unzip i
unizp i+1 # Not sure if i+1 works like that in `bash`
done
我用这种方法看到的问题是,在第一次迭代中它会起作用(i
将是 1 和 2)但在第二个迭代i
中将是 2 和 3,它应该是 3 和 4。
那么我的问题是,如何迭代结果ls
是这样的?
通常,您应该避免迭代结果
ls
- 例如,请参见ls
(以及要做什么)?与
for
循环相比,while
循环可以让您更好地控制分隔符和文件选择。例如:这里
printf '%s\0' my/path/S*.zip
将 shell glob 扩展为一个列表,该列表由 NULL 字符(唯一可能不会出现在 Unix 文件路径中的字符)明确分隔,然后每个read
命令读取其中一个。取消设置字段分隔符 - 这样做的IFS=
唯一效果是防止read
s 剥离前导空格(在极不可能的情况下,您需要处理此类名称)。一种可能更简洁的方法,使用
set
带有 shell glob 的内置函数将文件名明确地读入位置参数数组$@
:以二步循环一个版本排序的数组。