Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 更改解压缩的文件夹名称_Bash_Zip_Unzip_Script - Fatal编程技术网

Bash 更改解压缩的文件夹名称

Bash 更改解压缩的文件夹名称,bash,zip,unzip,script,Bash,Zip,Unzip,Script,我有相当多的目录(500+),每个目录(和可能的子目录)包含4个或更多的zip文件。 我设法拼凑了一个bash脚本,该脚本解压压缩文件,同时将zip文件名作为目录和所有目录层次结构进行维护 例如:如果我有一个名为100011\u test123.zip的zip文件,它包含10个文件。脚本将把所有文件解压缩到100011\u test123/目录中。 filename/directoryname中下划线之前出现的数字100010完全是随机的 下面是实际的bash脚本: #!/bin/bash cd

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

例如:如果我有一个名为
100011\u test123.zip的zip文件,它包含10个文件。脚本将把所有文件解压缩到
100011\u 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
#/bin/bash
光盘
找到-读取文件名时命名“*.zip”;do unar-d-o“`dirname”$filename“`“$filename”;完成;
找到-名称“*.zip”-类型f-删除
现在我想更新脚本,以便从.zip文件名中删除
100010
,而不篡改目录结构/层次结构(我想有一种方法可以在使用
unar
命令之前重命名zip文件),然后在开始时将文件解压缩到没有
100010
的目录中

我已经坚持了三天多了。如果您对此有任何见解,我们将不胜感激


谢谢。

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

您可以尝试以下代码

#!/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#在没有文件名匹配时防止迭代
shopt-s globstar#./**/允许在子目录内搜索
#如果希望所有输出目录位于同一位置,请设置basedir
#basedir=“$PWD”
适用于拉链内的拉链,/***/.zip;做
#提取包含存档的基本目录
zipdir=“${zipfile%/*}”
#提取不带目录路径的基名称
basename=“${zipfile##*/}”
#删除.zip扩展名
#100011_test123.zip->100011_test123
无扩展=“${basename%.zip}”
#删除之前的所有内容,然后首先下划线100011_
#100011_test123->test123
outputdir=“${basedir:-$zipdir}/${extensionless#*.}”
#创建输出目录或继续下一个存档
#mkdir-ptest123
mkdir-p“$outputdir”|继续
#将zipfile解压到outputdir中,如果成功,则删除zipfile
#UNRR-d-o test123 100011_test123.zip和rm-f-100011_test123.zip
unar-d-o“$outputdir”$zipfile”和rm-f--“$zipfile”
完成

您能否提供一些zip文件名示例,以确定100010_uu在zip名称和解压文件夹中的位置,或者这些文件将解压到您必须创建的自己的文件夹中,或者100010_uuu文件夹名称是存档内容的一部分?您是否有理由对zip文件使用UNRR而不是解压?子文件夹中是否有需要搜索的zip文件,或者这些文件都在同一层次结构级别?嗨,Léa Gris,谢谢你的脚本。它就像一个符咒。是的,zip文件位于子目录中。不,没有理由使用UNAR InOrder解压文件。请按照此URL进行目录层次结构(由于明显的原因,所有敏感信息都已被删除):我有一个名为
未压缩的
目录。它包含500多个子目录。500+子目录中的每一个子目录都包含多个zip文件(某些子目录为空)。是否可以从
uncompressed
目录执行脚本,这样文件将在各自的子目录中解压,而不需要目录名中的
xxxxxx
数字?@LéaGris感谢修复。
zip_文件=($(find.-name“*.zip”)
这将再次使用空格或换行符拆分文件名。要从命令的输出安全地创建数组,请使用
mapfile
mapfile-d''zipfiles未压缩
的目录。它包含500多个子目录。500+子目录中的每一个子目录都包含多个zip文件(某些子目录为空)。是否可以从
uncompressed
目录执行脚本,这样文件就可以在各自的子目录中解压,而不需要目录名中的
xxxxxx
数字?@SirajAhmad I增加了对处理子目录中档案的支持。非常感谢。你是救命恩人。剧本正是我想要的。