【问题标题】:Unzip a single ".zip" file into multiple directories as per the name of the files contained in zip file - Linux根据 zip 文件中包含的文件名,将单个“.zip”文件解压缩到多个目录中 - Linux
【发布时间】:2017-08-16 12:32:14
【问题描述】:

我有以下情况:- 我的 Zip 文件 = abcd.zip 它的内容:-

  1. a.txt
  2. b.txt
  3. c.txt

现在我想将此 zip 文件解压缩到文件夹 a/ 、 b/ 和 c/ 中。 (txt文件大小写均可)

所以基本上我希望将文件解压缩到他们自己指定的目录中。

【问题讨论】:

  • 您的 zip 文件不包含目录?我的意思是它总是只包含 .txt 文件吗?
  • 是的,它不包含任何目录

标签: linux bash shell scripting


【解决方案1】:
  1. 将存档解压缩到当前目录。
  2. 执行以下命令:
    for i in `ls -1 *.txt | sed 's/\.[a-z]*//g'`; do mkdir $i; mv $i.* $i/; done

【讨论】:

    【解决方案2】:

    你可以尝试如下,

    将此脚本放在与 zip 文件相同的目录中,并将 zip 文件的名称作为参数传递给脚本。

    #!/usr/bin/ksh
    
    name="$1"
    
    list="$(unzip -l "${name}" | sed -n '/---/,/---/{ /----/d; p; }' | awk '{print $4}')"
    
    for file in ${list}
    do
       dirnam=$(basename "${file}" ".txt")
       mkdir -p "${dirnam}"
       unzip "${name}" -d "${dirnam}" "${file}"
    done
    

    示例:

    /home/abis> ./unzip.sh test.zip 
    Archive:  test.zip
     extracting: 1/1.txt                 
    Archive:  test.zip
     extracting: 2/2.txt                 
    Archive:  test.zip
     extracting: 3/3.txt 
    

    【讨论】:

      【解决方案3】:

      如果都是.txt:
      zipinfo -1 abc.zip | while read line;do mkdir -p ${line%.txt}; unzip abc.zip $line -d ${line%.txt};done

      对于任何扩展名(将最后一个点之后的所有内容视为扩展名):
      zipinfo -1 abc.zip | while read line;do mkdir -p ${line%.*}; unzip abc.zip $line -d ${line%.*};done

      如需扩展列表:
      zipinfo -1 abc.zip | while read line;do mkdir -p ${line%.?(txt|jpg|gif)}; unzip abc.zip $line -d ${line%.?(txt|jpg|gif)};done

      最后一个选项需要 extglob,默认情况下是禁用的。所以运行shopt extglob 看看它是打开还是关闭。 shopt -s extglobenable 和 shopt -u extglobdisable。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-29
        • 2021-04-29
        • 1970-01-01
        • 2018-08-02
        • 2018-02-24
        • 1970-01-01
        相关资源
        最近更新 更多