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
    • 最新
    • 标签
主页 / unix / 问题 / 476522
Accepted
Dennis Wiencken
Dennis Wiencken
Asked: 2018-10-20 02:52:51 +0800 CST2018-10-20 02:52:51 +0800 CST 2018-10-20 02:52:51 +0800 CST

解压缩到与存档同名的文件夹

  • 772

我有很多rar文件

- Folder/
--- Spain.rar
--- Germany.rar
--- Italy.rar

所有文件都不包含根文件夹,因此它只是文件。

提取时我想要实现的是这个结构:

- Folder/
-- Spain/
---- Spain_file1.txt
---- Spain_file2.txt
-- Germany/
---- Germany_file1.txt
---- Germany_file2.txt
-- Italy/
---- Italy_file1.txt
---- Italy_file2.txt

这样就创建了一个具有存档名称的文件夹,并将存档提取到其中。

我在另一个线程中找到了这个 bash 示例,但它对我不起作用,它试图创建一个以所有文件为名称的文件夹。

#!/bin/bash

for archive in "$(find . -name '*.rar')"; do
  destination="${archive%.rar}"
  if [ ! -d "$destination" ] ; then mkdir "$destination"; fi
  unrar e "$archive" "$destination"
done

任何想法我怎么能做到这一点?

shell-script archive
  • 3 3 个回答
  • 4206 Views

3 个回答

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2018-10-20T03:16:15+08:002018-10-20T03:16:15+08:00

    我的个人档案中有一个脚本可以做到这一点。更准确地说,它例如解压Spain.rar到一个名为 的新目录Spain,除非其中的所有文件Spain.rar都已经在同一个顶级目录下,则保留该顶级目录。

    #!/bin/sh
    
    # Extract the archive $1 to a directory $2 with the program $3. If the
    # archive contains a single top-level directory, that directory
    # becomes $2. Otherwise $2 contains all the files at the root of the
    # archive.
    extract () (
      set -e
      archive=$1
      case "$archive" in
        -) :;; # read from stdin
        /*) :;; # already an absolute path
        *) archive=$PWD/$archive;; # make absolute path
      esac
      target=$2
      program=$3
      if [ -e "$target" ]; then
        echo >&2 "Target $target already exists, aborting."
        return 3
      fi
      case "$target" in
        /*) parent=${target%/*};;
        */[!/]*) parent=$PWD/${target%/*};;
        *) parent=$PWD;;
      esac
      temp=$(TMPDIR="$parent" mktemp -d)
      (cd "$temp" && $program "$archive")
      root=
      for member in "$temp/"* "$temp/".*; do
        case "$member" in */.|*/..) continue;; esac
        if [ -n "$root" ] || ! [ -d "$member" ]; then
          root=$temp # There are multiple files or there is a non-directory
          break
        fi
        root="$member"
      done
      if [ -z "$root" ]; then
        # Empty archive
        root=$temp
      fi
      mv -v -- "$root" "$target"
      if [ "$root" != "$temp" ]; then
        rmdir "$temp"
      fi
    )
    
    # Extract the archive $1.
    process () {
      dir=${1%.*}
      case "$1" in
        *.rar|*.RAR) program="unrar x";;
        *.tar|*.tgz|*.tbz2) program="tar -xf";;
        *.tar.gz|*.tar.bz2|*.tar.xz) program="tar -xf"; dir=${dir%.*};;
        *.zip|*.ZIP) program="unzip";;
        *) echo >&2 "$0: $1: unsupported archive type"; exit 4;;
      esac
      if [ -d "$dir" ]; then
        echo >&2 "$0: $dir: directory already exists"
        exit 1
      fi
      extract "$1" "$dir" "$program"
    }
    
    for x in "$@"; do
      process "$x"
    done
    

    用法(在您$PATH的名称下安装此脚本extract并使其可执行后):

    extract Folder/*.rar
    
    • 7
  2. bruno vianna
    2021-01-28T06:59:29+08:002021-01-28T06:59:29+08:00

    您可以使用unar而不是unrar. 当文件夹中有多个 rar 文件时,将默认创建一个同名的新目录。

    如果只有一个文件,您可以使用该-d选项。

    https://packages.ubuntu.com/search?keywords=unar

    • 3
  3. Martin Andersen
    2021-12-13T14:08:38+08:002021-12-13T14:08:38+08:00
    #!/bin/bash
    
    # https://ostechnix.com/a-bash-function-to-extract-file-archives-of-various-types/
    directory=`/usr/bin/dirname $1`
    filename=`/usr/bin/basename $1`
    filenameWithExt=$(/usr/bin/basename "$1")
    filenameWithoutExt="${filenameWithExt%.*}"
    
    # echo "directory: $directory"
    # echo "filename: $filename"
    # echo "filenameWithoutExt: $filenameWithoutExt"
    # Bash Function To Extract File Archives Of Various Types
    extract () {
        /usr/bin/mkdir "$directory/$filenameWithoutExt"
         if [ -f $1 ] ; then
             case $1 in
                 *.tar.bz2)   /usr/bin/tar xjf "$1" -C "$directory/$filenameWithoutExt"     ;;
                 *.tar.gz)    /usr/bin/tar xzf "$1" -C "$directory/$filenameWithoutExt"     ;;
                 *.bz2)       /usr/bin/bunzip2 "$1" -C "$directory/$filenameWithoutExt"     ;;
                 *.rar)       /usr/bin/rar x "$1" "$directory/$filenameWithoutExt"      ;;
                 *.gz)        /usr/bin/gunzip "$1"      ;;
                 *.tar)       /usr/bin/tar xf "$1" -C "$directory/$filenameWithoutExt"      ;;
                 *.tbz2)      /usr/bin/tar xjf "$1" -C "$directory/$filenameWithoutExt"     ;;
                 *.tgz)       /usr/bin/tar xzf "$1" -C "$directory/$filenameWithoutExt"    ;;
                 *.zip)       /usr/bin/unzip "$1" -d "$directory/$filenameWithoutExt"       ;;
                 *.Z)         /usr/bin/uncompress "$1"  ;;
                 *.7z)        eval "7z e -o$directory/$filenameWithoutExt/ $1"  ;;
                 *)           /usr/bin/echo "'$1' cannot be extracted via extract()" ;;
             esac
         else
             echo "'$1' is not a valid file"
         fi
    }
    
    extract "$1"
    
    • 0

相关问题

  • 在awk中的两行之间减去相同的列

  • 打印文件行及其长度的脚本[关闭]

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 按分隔符拆分并连接字符串问题

  • MySQL Select with function IN () with bash array

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve