将1百万+档案解压缩到正确的文件夹结构

时间:2018-03-12 23:54:48

标签: linux ubuntu unzip

首先,我是Linux新手,因为我为这个项目设置了一个AWS Ubuntu实例,所以要善待。

我在以下文件夹结构(财务数据)中下载了大约100万个包含.csv的.zip文件:

Main Folder
    |---- Exchange1
    |         |-----Pair1
    |         |       |-----Month
    |         |               |------.Zips
    |         |-----PairN
    |                 |-----Month
    |                         |------.Zips
    |---- ExchangeN
              |-----Pair1
              |       |-----Month
              |               |------.Zips
              |-----Pair2
              |       |-----Month
              |               |------.Zips
              |-----PairN
                      |-----Month
                              |------.Zips

我想提取其下面的父Pair个文件夹下的每个zip文件,忽略月份文件夹,以便新结构看起来像这样:

Main Folder
    |---- Exchange1
    |         |-----Pair1
    |         |       |------Extracted .csv's
    |         |-----PairN
    |                 |------Extracted .csv's
    |---- ExchangeN
              |-----Pair1
              |       |------Extracted .csv's
              |-----Pair2
              |       |------Extracted .csv's
              |-----PairN
                      |------Extracted .csv's

感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

在主文件夹中运行此脚本。

#! /bin/sh 

#find all nested zip files and assign it to an array    
files=( $(find . -iname "*zip*" -exec echo {} \;) )
for i in "${files[@]}"
do
 #extract the path to unzip the archive
 path=$(echo "$i" | cut -d '/' -f-3)
 unzip $i -d $path
done

运行时请小心。当目录包含带换行符,管道等的文件名时,将ls/find的输出分配给数组会产生奇怪且意外的后果。

引用格雷格

  

Unix几乎允许文件名中的任何字符,包括空格,换行符,逗号,管道符号,以及除了NUL之外你曾尝试用作分隔符的其他任何字符。

参考 1. Why you shouldn't parse the output of ls

答案 1 :(得分:0)

可能最有效的方法是:

find . -iname "*.zip" -execdir unzip -d ../ {} ";"

从主文件夹/发出。

但首先尝试使用回声进行视觉控制:

find ./Exchange1/Pair1 -iname "*.zip" -execdir echo unzip -d ../ {} ";"

如果这看起来很有希望,请复制一些测试文件夹并尝试:

find ./Exchange1/ -iname "*.zip" -execdir unzip -d ../ {} ";"

如果有效,请拍摄真实文件。