0

我在此线程中看到了以下代码,用于将子文件夹中的所有 .zip 格式解压缩到相应的子文件夹中。我对这段代码的问题如下。

(1) 这是批处理作业的 bash 脚本吗?如果是这样,我可以将其作为sudo bash filename.bat运行。

(2)如何在代码中指定父文件夹目录。父目录下包含所有子文件夹,这些子文件夹又包含压缩(压缩)文件。

(3)如何修改代码以包含.rar.7z等其他压缩格式

 for file in *.zip; do
       dir=$(basename "$file" .zip) # remove the .zip from the filename
       mkdir "$dir"
       cd "$dir" && unzip ../"$file" && rm ../"$file" # unzip and remove file if successful
       cd ..
  done
4

1 回答 1

1
  1. 是的,该代码片段看起来像一个bash脚本。如果它被命名filename.bat,你应该可以使用sudo bash filename.bat它来运行它。

  2. 该代码假定当前目录是包含所有压缩文件的“父文件夹”。.zip您需要修改代码以处理包含文件的子目录。有很多方法可以做到这一点。

  3. 鉴于需要处理文件以外的格式.zip,您可能会修改代码以使用作为参数提供的文件名作为要解压缩的文件。

此代码可能有效:

for file in "$@"
do
    dir=$(dirname "$file")
    extn=${base##*.}
    base=$(basename "$file" .$extn)
    mkdir -p "$dir/$base"
    (
    cd "$dir/$base"
    case $extn in
    zip)   unzip "../$base.$extn";;
    esac
    )
done

现在,理论上,您可以扩展case语句中的扩展名列表以包含其他文件格式。但是,您应该知道,并非所有压缩器都打包多个文件。通常,您具有复合格式,例如.tar.gzor.tar.xz.tar.bz2.tar对应的压缩器(或解压器),只是简单地解压文件(丢失压缩后缀),而不需要从文件里面提取数据。但是,如果rar7z确实表现得像zip,那么您可以使用:

    case $extn in
    (zip)   unzip "../$base.$extn";;
    (rar)   unrar "../$base.$extn";;  # Or whatever the command is
    (7z)    un7z  "../$base.$extn";;  # Or whatever the command is
    (*)     echo "$0: unrecognized extension $extn on $file" >&2;;
    esac

如果您认为合适,您还可以恢复代码以删除文件的压缩形式。

于 2012-11-25T15:38:36.253 回答