更改解压后的文件夹名称

change unzipped folder name

我有相当多的目录 (500+),每个目录(和可能的子目录)包含 4 个或更多 zip 文件。 我设法拼凑了一个 bash 脚本来解压缩压缩文件,同时将 zip 文件名保持为目录和所有目录层次结构。

例如:如果我有一个名为 100011_test123.zip 的 zip 文件,它包含 10 个文件。该脚本会将所有文件解压缩到 100011_test123/ 目录中。 filename/directoryname 中下划线前的数字 100010 完全随机出现。

这是实际的 bash 脚本:

#!/bin/bash
cd <directory-with-large-number-of-zip-files>
find . -name "*.zip" | while read filename; do unar -d -o "`dirname "$filename"`" "$filename"; done;
find . -name "*.zip" -type f -delete

现在我想更新脚本以便从 .zip 文件名中删除 100010_ 而不会篡改目录 structure/hierarchy(我猜之前有一种方法可以重命名 zip 文件使用 unar 命令),然后将文件解压缩到开头没有 100010_ 的目录中。

我已经坚持了 3 天多了。对此的任何见解将不胜感激。

谢谢。

您需要先为每个条目解析目录名和文件名。为此,请检查 ${fullpath%/*}${fullpath##*/}。并且 awk 用于将文件名与“_”分开并获取它的第二部分。

您可以试试下面的代码。

#!/bin/bash
# cd directory
zip_files=($(find . -name "*.zip"))
for fullpath in "${zip_files[@]}"; do
    echo "Processing: "$fullpath""
    DIRNAME="${fullpath%/*}"
    FILENAME="${fullpath##*/}"
    NEW_FILENAME="`echo $FILENAME | awk -F'_' '{print $NF}'`"
    echo "  DIRNAME="$DIRNAME
    echo "  NEW_FILENAME="$NEW_FILENAME

    mv $fullpath "$DIRNAME/$NEW_FILENAME"
    # call unar command
    unar -d -o $DIRNAME $NEW_FILENAME
    # delete file if you want
done

所有 zip 文件都在同一级别,您不需要查找,但常规文件名模式 globbing 将迭代每个 zip 存档。

并且使用 bash 的 globstar 选项,您还可以在子目录中找到 zip 存档

#!/usr/bin/env bash

shopt -s nullglob # Prevents iterating if no filename match

shopt -s globstar # ./**/ Allow searching inside sub-directories

# Set the basedir if you want all output directories at same place
#basedir="$PWD"

for zipfile in ./**/*.zip; do
  # Extract the base directory containing the archive
  zipdir="${zipfile%/*}"

  # Extract the base name without the directory path
  basename="${zipfile##*/}"

  # Remove the .zip extension
  # 100011_test123.zip -> 100011_test123
  extensionless="${basename%.zip}"

  # Remove everything before and first underscore 100011_
  # 100011_test123 -> test123
  outputdir="${basedir:-$zipdir}/${extensionless#*_}"

  # Create output directory or continue with next archive
  # mkdir -p test123
  mkdir -p "$outputdir" || continue

  # Unzip the zipfile into the outputdir and remove the zipfile if successful
  # unrar -d -o test123 100011_test123.zip && rm -f -- 100011_test123.zip
  unar -d -o "$outputdir" "$zipfile" && rm -f -- "$zipfile"
done