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 / 问题 / 1005614
Accepted
alien250
alien250
Asked: 2018-02-13 15:15:23 +0800 CST2018-02-13 15:15:23 +0800 CST 2018-02-13 15:15:23 +0800 CST

如何递归压缩文件到他们自己的文件夹中?

  • 772

我有以下目录结构:

/Data
 - file 1
 - file 2

  /Folder1

   - file 3
   - file 4

  /Folder2
   - file 5
   - file 6

    /Folder3
      - file 7
      - file 8

在 Linux 中,我想压缩每个目录中的文件(不包括文件夹),并在每个文件夹中创建一个 7z(或 zip)存档,结果如下:

/Data
     Data.7z (Note: this should contain only file1 & 2, not any sub directories)

      /Folder1

       Folder1.7z (this should contain only file3 & 4, not any sub directories)

      /Folder2
       Folder2.7z (this should contain only file5 & 6, no Folder3)

        /Folder3
          Folder3.7z (should contain only file7 & 8)

以下脚本适用于第一个目录,但不适用于子目录:

for i in */ ; do base=$(basename “$i”) ; cd $base ; 7za a -t7z -r $base * ; .. ; cd .. ; done;

我怎样才能做到这一点?

directory archive zip 7zip
  • 2 2 个回答
  • 2237 Views

2 个回答

  • Voted
  1. Best Answer
    steeldriver
    2018-02-13T17:59:46+08:002018-02-13T17:59:46+08:00

    如果你想使用7z,棘手的部分似乎是说服它不要递归;文档中指示的-r-开关似乎不起作用,软件作者建议的解决方法是使用通配符表达式排除子目录-x!*/

    所以,给定

    $ tree Data
    Data
    ├── file1
    ├── file2
    ├── Folder1
    │   ├── file3
    │   └── file4
    ├── Folder2
    │   ├── file5
    │   └── file6
    └── Folder3
        ├── file7
        └── file8
    
    3 directories, 8 files
    

    然后

    find Data -type d -execdir sh -c 'cd "$1" && 7z a "$1".7z -x!*/ && cd -' sh {} \;
    

    结果是

    $ tree Data
    Data
    ├── Data.7z
    ├── file1
    ├── file2
    ├── Folder1
    │   ├── file3
    │   ├── file4
    │   └── Folder1.7z
    ├── Folder2
    │   ├── file5
    │   ├── file6
    │   └── Folder2.7z
    └── Folder3
        ├── file7
        ├── file8
        └── Folder3.7z
    
    3 directories, 12 files
    

    例如,我们可以使用以下方法检查Folder2.7z仅包含其自己文件夹的文件

    $ 7z l Data/Folder2/Folder2.7z 
    
    7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
    p7zip Version 16.02 (locale=en_CA.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs Intel(R) Core(TM)2 Duo CPU     P9600  @ 2.53GHz (1067A),ASM)
    
    Scanning the drive for archives:
    1 file, 128 bytes (1 KiB)
    
    Listing archive: Data/Folder2/Folder2.7z
    
    --
    Path = Data/Folder2/Folder2.7z
    Type = 7z
    Physical Size = 128
    Headers Size = 128
    Solid = -
    Blocks = 0
    
       Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2018-02-12 18:37:37 ....A            0            0  file5
    2018-02-12 18:37:37 ....A            0            0  file6
    ------------------- ----- ------------ ------------  ------------------------
    2018-02-12 18:37:37                  0            0  2 files
    

    注意:可能需要在历史扩展运算符!*/所在的环境(例如交互式 bash shell)中进行额外的转义。!

    • 3
  2. user unknown
    2018-02-13T17:11:47+08:002018-02-13T17:11:47+08:00

    这是未经测试的代码,仅与“echo”一起使用,因为我不喜欢以多个 zip 文件结尾。它是幻想的 zip 语法,因为我不知道 7za,但我会解释一下:

    find . -type d -execdir /.../ad-hoc.sh {} ";"
    

    脚本 ad-hoc.sh 必须使用绝对路径进行寻址,并且不应位于当前路径中,以免影响结果,但它可能位于 parentdir 中:

    find . -type d -execdir $PWD/../ad-hoc.sh {} ";"
    

    并且,如果不是可执行的,则显式调用:

    find . -type d -execdir bash $PWD/../ad-hoc.sh {} ";"
    

    Find 将在当前目录中查找,仅查找类型为 d (dirs) 的文件,在哪里 - 执行带有参数 {} 的 bashscript,即找到的目录。

    好的 - 什么是 ad-hoc.sh,我们在 dir 和 subdirs 中执行?这是另一个发现:

    #!/bin/bash
    dir=$1
    find $dir -maxdepth 1 -type f -exec echo zip -o "$dir.zip" {} +
    

    -maxdepth 1 阻止 find 搜索子目录,-type 表示只对文件进行操作。-exec 启动一个命令,用于测试“echo zip ...”,但如果它看起来很有希望(你经常做备份,不是吗?),你 - 好吧,这里开始我的伪代码:-o:= -output "$PWD.zip", {} + 是文件列表。

    tree
    .
    ├── buch-klein.kry
    ├── buch.kry
    ├── crypt
    │   ├── moveto.sh.crypt
    │   └── sub1
    │       ├── foo.crypt
    │       └── sub2
    │           └── bar.crypt
    ├── original
    │   ├── 1
    │   │   └── 2
    │   │       └── 3
    │   ├── moveto.sh
    │   └── sub1
    │       └── sub2
    │           └── up3 -> ../../../nr
    ├── outputfile.txt
    ├── rot.sh
    └── zoom.sh
    
    find . -type d -execdir $PWD/../ad-hoc.sh {} ";" 
    zip -o ./..zip ././buch-klein.kry ././rot.sh ././buch.kry ././zoom.sh ././outputfile.txt
    zip -o ./original.zip ./original/moveto.sh
    zip -o ./crypt.zip ./crypt/moveto.sh.crypt
    zip -o ./sub1.zip ./sub1/foo.crypt
    zip -o ./sub2.zip ./sub2/bar.crypt
    

    每个带有扩展名的文件都是一个普通文件,每个没有扩展名的文件都是一个目录或指向目录 (up3) 的符号链接。

    {} 必须是 find -exec 命令在终止“;”之前的最后一个元素 或+,所以你必须相应地构建你的7z命令。

    所以如果你的 7za 命令是

          7za a -t7z -r $dir.7za *
    

    ad-hoc.sh 可能如下所示:

    #!/bin/bash
    dir=$1
    find $dir -maxdepth 1 -type f -exec echo 7za -t7z -r "$dir.7za" {} +
    
    • 0

相关问题

  • 如果我删除主文件夹中的默认文件夹会怎样?

  • 我可以将 Nautilus 配置为进入存档而不是在外部 File Roller 应用程序窗口中打开它们吗?

  • 如何为我的罗技网络摄像头创建 udev 规则 [关闭]

  • 如何在不更改名称的情况下隐藏目录或文件?

  • 如何查看存档中可用的软件包的所有版本?

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