更改解压后的文件夹名称
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
我有相当多的目录 (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