如何将文件解压缩并重新压缩到与.zip文件同名的子目录中?

时间:2016-08-21 15:22:39

标签: macos shell zsh oh-my-zsh baseline

摘要
我需要通过以下方式“修复”一批.zip文件,遍布整个文件系统:

  • 用“_”替换名称中的“”(空格),以及其内容文件的名称
  • 重新拉回拉链

坚持解压缩因为“$(dirname”$ 0“)/ $(basename”$ 0“)”会引发错误。

更长时间。
文件层次结构:

banners/
       |
       germany/
       |      |
       |      active/
       |      |     |
       |      |     300x250/
       |      |     |      |
       |      |     |      file.jpg
       |      |     |      AC2 xx.zip
       |      |     |
       |      |     600x228/
       |      |            |
       |      |            file.jpg
       |      |            AC4 xx.zip
       |      nautics/
       |
       |
       austria/
       |
       ...

这就是我的尝试:

~/banners/> find . -name "*" -exec sh -c 'mv -- "$0" "$(0// /_)"' {} \;

在这里,我从banners/向下删除了所有文件名/目录名中的所有空格。
AC2 xx.zip现在看起来像AC2_xx.zip

我现在需要将这些.zip文件解压缩到一个新的子目录中,与.zip文件本身处于同一级别,命名与这些.zip文件相同。

以下是我尝试的命令:

find . -name "*.zip" -exec sh -c 'unzip "$0" "$(dirname "$0")/$(basename "$0")"' {} \;

这给了我一堆(全屏)错误,比如这个:

  

〜>存档:./ sun& amp / dugi_otok / 970x250 / SS4_970x250.zip
  〜>警告:文件名不匹配:./ sun& amp / dugi_otok / 970x250 / SS4_970x250.zip

对于我的生活,我无法想象这一个。

重新删除空格
如果我让它工作并且文件被解压缩,那么计划是从顶级目录mv重新运行banners/命令,并再次用“_”替换空格。这会处理.zip文件的内容。

重新拉链
最后,我需要重新压缩这些新创建的子目录,命名为原始.zip文件并覆盖现有的.zip文件(最初是解压缩的)。

基本上重新拉链:

~> banners/germany/active/dugi_otok/300x250/AC2_xx/(newly unzipped contents)

成:

~> banners/germany/active/dugi_otok/300x250/AC2_xx.zip

我为这种混乱道歉,但我找不到更好的解释方法。

2 个答案:

答案 0 :(得分:0)

basename不会删除扩展程序,因此您的:

"$(dirname "$0")/$(basename "$0")"

只需重新创建$0。替换为:

"$(dirname "$0")/$(basename -s ".zip" "$0")"

-s的{​​{1}}选项会删除后缀

HTH

答案 1 :(得分:0)

  

我现在需要将这些.zip文件解压缩到一个新的子目录中   作为.zip文件本身的级别,命名与这些.zip相同   文件。

unzip选项-d适用于此:

find . -name "*.zip" -exec sh -c 'unzip "$0" -d "${0%.zip}"' {} \; 

使用您尝试的命令,unzip的第二个参数被视为要从zip文件中提取的文件的名称,当然在其中找不到。