首先,我是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
感谢任何帮助,谢谢。
答案 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 :(得分:0)
可能最有效的方法是:
find . -iname "*.zip" -execdir unzip -d ../ {} ";"
从主文件夹/发出。
但首先尝试使用回声进行视觉控制:
find ./Exchange1/Pair1 -iname "*.zip" -execdir echo unzip -d ../ {} ";"
如果这看起来很有希望,请复制一些测试文件夹并尝试:
find ./Exchange1/ -iname "*.zip" -execdir unzip -d ../ {} ";"
如果有效,请拍摄真实文件。