我刚开始使用bash脚本,我发现很难解决这个问题。
我有一个父文件夹,包含子目录和压缩子目录的混合。
在这些子目录中也有更多嵌套的zip文件。
不仅有.zip文件,而且还有.rar和.7z文件,它们也包含嵌套的zip/rars/7zs。
我想递归地解压缩、解压缩和un7z所有嵌套的子目录,直到父文件夹不再包含任何.rar、.zip、.7zip文件。(这些最终需要在它们被提取后被移除)。可能有数千个子目录,它们都位于不同的嵌套深度。你可以有压缩文件夹或压缩文件。
但是,我希望保留我的文件夹结构,因此解压缩的文件夹必须保持在已解压缩的位置。
我已经尝试过此脚本,用于解压缩,但它不保留文件结构。
#!/bin/bash
while [ "`find . -type f -name '*.zip' | wc -l`" -gt 0 ]
do
find . -type f -name "*.zip" -exec unzip -- '{}' \; -exec rm -- '{}' \;
done我想举个例子:
文件夹'a‘包含压缩文件夹'b.zip’,其中包含压缩文本文件pear.zip (即已压缩到pear.zip a/b.zip(/pear.zip)的pear.txt )
我希望文件夹'a‘包含'b’,包含pear.txt‘a/b/珠光’
上面的脚本将'b‘(b是空的)和pear都放在'a’文件夹中,在那里执行脚本,这不是我想要的。例如'a/b‘和’a/珠光‘
发布于 2021-11-18 19:06:17
你可以试试这个:
#!/bin/bash
while :; do
mapfile -td '' archives \
< <(find . -type f -name '*.zip' -o -name '*.7z' -print0)
[[ ${#archives[@]} -eq 0 ]] && break
for i in "${archives[@]}"; do
case $i in
*.zip) unzip -d "$(dirname "$i")" -- "$i";;
*.7z) 7z x "-o$(dirname "$i")" -- "$i";;
esac
done
rm -rf "${archives[@]}" || break
donefind列出。在正确的位置提取该列表,并删除档案。这会重复,直到找到零档。unrar命令(我不熟悉它)。-o -name '*.rar'添加到find,将另一个案例添加到case。如果没有使用cd "$(dirname "$i")" && unrar "$i".指定目标目录的选项,则可以使用unrar
unzip ... || exit 1退出,并手动处理。https://stackoverflow.com/questions/70022554
复制相似问题