【问题标题】:Create a dedicated folder for every zip files in a directory and extract zip files为目录中的每个 zip 文件创建一个专用文件夹并提取 zip 文件
【发布时间】:2011-12-27 19:37:06
【问题描述】:

如果我选择一个 zip 文件并右键单击“在此处提取”,则会创建一个带有 zip 文件名的文件夹,并将 zip 文件的全部内容提取到其中。

但是,我想通过 shell 转换几个 zip 文件。 但是当我这样做时

unzip filename.zip

文件夹"filename"没有创建,但所有文件都被解压到当前目录中。

我查看了参数,但没有这样的参数。 我也试过了

for zipfile in \*.zip; do mkdir $zipfile; unzip $zipfile -d $zipfile/; done

但是 2.$zipfile 和 4.$zipfile 的 .zip 扩展名必须用 sed 删除。 如果我这样做了

for zipfile in \*.zip; do mkdir sed 's/\.zip//i' $zipfile; unzip $zipfile -d sed 's/\.zip//i' $zipfile/; done 

它不工作。

如何正确替换$zipfile.zip 扩展?

有没有比 shell 脚本更简单的方法?

【问题讨论】:

    标签: linux shell sed awk unzip


    【解决方案1】:

    unzip file.zip -d xxx 会将文件解压到目录 xxx 中,如果不存在 xxx 将被创建。您可以查看手册页了解详细信息。

    下面的 awk 行应该可以完成这项工作:

    ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}'|sh
    

    请参阅下面的测试

    注意,我最后删除了 |sh,因为我的 zip 是假档案;我只想在这里显示生成的命令行。

    kent$  ls -l
    total 0
    -rw-r--r-- 1 kent kent 0 Nov 12 23:10 001.zip
    -rw-r--r-- 1 kent kent 0 Nov 12 23:10 002.zip
    -rw-r--r-- 1 kent kent 0 Nov 12 23:10 003.zip
    -rw-r--r-- 1 kent kent 0 Nov 12 23:10 004.zip
    -rw-r--r-- 1 kent kent 0 Nov 12 23:10 005.zip
    -rw-r--r-- 1 kent kent 0 Nov 12 23:10 006.zip
    -rw-r--r-- 1 kent kent 0 Nov 12 23:10 007.zip
    
    kent$  ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}'
    unzip 001.zip -d 001
    unzip 002.zip -d 002
    unzip 003.zip -d 003
    unzip 004.zip -d 004
    unzip 005.zip -d 005
    unzip 006.zip -d 006
    unzip 007.zip -d 007
    

    【讨论】:

    • 但我不明白为什么 $0 包含完整的文件名而 $1 不包含“.zip”扩展名?
    • @jack 我将“.zip”定义为 FS(字段分隔符)。所以 001.zip 将分为“001”和“”两部分。 $1 是第一个字段。 $0 是整行,在这种情况下是 awk 中的“001.zip”,该字段从 1 开始计数,而不是 0。
    • 但是如果 xxx 是嵌套目录路径,则会失败并发出“无法创建提取目录”消息。当然我可以写一个 shell 并检查中间目录是否存在,然后提前创建它)但我希望只用 unzip 命令一次性完成。
    • 这个命令很好,但是如果文件名中有空格就不行了。要考虑空格,您需要执行 ls *.zip | awk -F'.zip' '{print "unzip \""$0"\" -d \""$1"\""}' | sh
    • 不应解析 ls 输出。无法在我的系统上运行,因为 ls 默认启用了 -lah。 ls 是一个交互式工具。使用路径名扩展。
    【解决方案2】:

    “在此处提取”只是您使用的任何 unzip 包装器的一个功能。 unzip 只会提取存档中的实际内容。可能没有比 shell 脚本更简单的方法了。但是,如果您有符合 POSIX 标准的外壳,则不需要 sedawk 等:

    for f in *.zip; do unzip -d "${f%*.zip}" "$f"; done
    

    (您不得转义 *,否则路径名扩展将不会发生。)请注意,如果 ZIP 存档包含目录,例如 Eclipse 存档(始终包含 eclipse/),您最终会在任何情况下都使用./eclipse*/eclipse/eclipse.ini。在unzip 之前添加echo 以进行试运行。

    【讨论】:

    • @jack,这个答案应该是接受的答案。你不应该使用ls 输出任何东西。 ls 是一个交互式查看目录元数据的工具。任何用代码解析ls 输出的尝试都会被破坏。 Glob 更加简单和正确:for file in *.zip。阅读Parsing ls
    • 注意:您能否通过“如何创建文件夹以提取其中的单个 zip 文件? "
    • 请问为什么这样做 alias unzipd='function uzd() { args=("$@") for f in "${args[@]}"; do echo "------- $f ----------" unzip $f -d "${f%*.zip}" done } uzd ' 而不是 alias unzipd=' args=("$@") for f in "${args[@]}"; do echo "------- $f ----------" unzip $f -d "${f%*.zip}" done ' (为什么别名不能处理它?)错误:标记附近的语法错误 //remark:它们在多行中
    • 并在此处设置stackoverflow.com/a/7131683/7668448,它说别名不直接接受参数而函数接受,但我总是使用 gipsh="git push origin $@" 之类的东西。 $@ 有什么区别?
    • 我有答案(一半),我对别名的工作原理没有一个很好的概念,它就像 c/c++ 中的包含一样工作,无论别名持有什么,都会被复制到它的位置,如果 $@, $1 .. 写到末尾(或任何地方),它会被省略,所以例如:alias lsg='ls | grep ' 然后lsg zip,这将相当于ls | grep zip。和alias ech='echo "$1" ' ech ok yes again |您希望 ok 只显示,但结果就像 "$1" 不存在。就像变量被忽略一样。如果有人可以解释更多,那就太好了。很多。
    【解决方案3】:

    p7zip,命令行版本的 7zip 完成这项工作

    7z x '*.zip' -o'*'
    

    在 Debian 和 Ubuntu 上,您必须安装 p7zip-full

    【讨论】:

      【解决方案4】:

      aunpack 来自 atool 将默认为所有类型的档案执行此操作。

      【讨论】:

        【解决方案5】:

        在切换后添加文件夹名和斜杠,例如:

        unzip -d newfolder/ zipfile.zip
        

        zip 将创建文件夹“newfolder”并将存档解压缩到其中。

        请注意,斜杠不是必需的,但我想这只是旧习惯(我使用 Debian 和 Ubuntu)。

        【讨论】:

        • 对我来说斜杠是必需的,否则命令会抱怨没有这样的文件夹。
        【解决方案6】:

        在 Termux bash 中,我最终得到了这个,测试了文件名中的空格和点。它仅删除文件夹名称的最后一个文件扩展名和点。这假定 zip 文件具有 .zip 扩展名,否则它将无法工作。在意识到它们只需要作为普通引号存在之前,试图 \ 转义引号或使用单引号时发疯了。在 zip 命令前面放置一个回显,或添加 -l 以审核该命令。出于某种原因,-d 的位置似乎对这个实现很重要。

        for f in *.zip; do unzip "$f" \-d "./${f%.*}/"; done; echo -end-
        

        【讨论】:

          【解决方案7】:
          1. 打开终端并找到 00* 文件
          cat filename.zip.00* > filename.zip
          

          等待进程结束,这取决于文件大小。

          1. 文件加入过程完成,现在可以运行输出文件了
          unzip filename.zip
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-16
            • 2021-04-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多