AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1215902
Accepted
GCGM
GCGM
Asked: 2020-03-10 05:18:35 +0800 CST2020-03-10 05:18:35 +0800 CST 2020-03-10 05:18:35 +0800 CST

以 2 个为一组选择列表中的元素 - Bash

  • 772

我正在尝试使用序列选择文件列表中的元素。为此,我按照文件夹中的模式创建了所有文件的列表:

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是这样的?

command-line bash ls
  • 2 2 个回答
  • 252 Views

2 个回答

  • Voted
  1. Best Answer
    steeldriver
    2020-03-10T05:44:30+08:002020-03-10T05:44:30+08:00

    通常,您应该避免迭代结果ls- 例如,请参见

    • bash 陷阱 #1
    • 为什么不解析ls(以及要做什么)?

    与for循环相比,while循环可以让您更好地控制分隔符和文件选择。例如:

    printf '%s\0' my/path/*.zip | while IFS= read -r -d '' f1 && IFS= read -r -d '' f2; do 
      echo 'unzipping files'; echo unzip "$f1"; echo unzip "$f2"
    done
    unzipping files
    unzip my/path/S1A_IW_SLC__1SDV_20180412T171648_20180412T171715_021437_024E95_BDA1.zip
    unzip my/path/S1A_IW_SLC__1SDV_20180424T171648_20180424T171715_021612_02540A_BB21.zip
    unzipping files
    unzip my/path/S1A_IW_SLC__1SDV_20180506T171649_20180506T171716_021787_025996_98AB.zip
    unzip my/path/S1A_IW_SLC__1SDV_20180518T171649_20180518T171716_021962_025F27_A15C.zip
    unzipping files
    unzip my/path/S1A_IW_SLC__1SDV_20180530T171650_20180530T171717_022137_0264C8_5D94.zip
    unzip my/path/S1A_IW_SLC__1SDV_20180611T171651_20180611T171718_022312_026A3D_BBFC.zip
    unzipping files
    unzip my/path/S1A_IW_SLC__1SDV_20180623T171652_20180623T171719_022487_026F7C_450E.zip
    unzip my/path/S1A_IW_SLC__1SDV_20180623T171652_20180623T171719_543456_64324F_452W.zip
    

    这里printf '%s\0' my/path/S*.zip将 shell glob 扩展为一个列表,该列表由 NULL 字符(唯一可能不会出现在 Unix 文件路径中的字符)明确分隔,然后每个read命令读取其中一个。取消设置字段分隔符 - 这样做的IFS=唯一效果是防止reads 剥离前导空格(在极不可能的情况下,您需要处理此类名称)。


    一种可能更简洁的方法,使用set带有 shell glob 的内置函数将文件名明确地读入位置参数数组$@:

    shopt -s nullglob
    
    set -- my/path/S*.zip
    while (($# > 1)); do 
      echo "unzipping files"; 
      echo unzip "$1"; echo unzip "$2"; 
      shift 2
    done
    
    • 1
  2. user986805
    2020-03-10T05:53:57+08:002020-03-10T05:53:57+08:00

    以二步循环一个版本排序的数组。

    #!/bin/bash
    
    eval \
    "a=($(ls -v1 --quoting-style=shell-escape files/*))"
    
    for ((i=0; i<${#a[@]}; i+=2)); do
        [[ -r ${a[$i]} ]] && \
            unzip "${a[$i]}"
        [[ -r ${a[(i+1)]} ]] && \
            unzip "${a[(i+1)]}"
    done
    
    • 1

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve