所以我一直在尝试解压缩.rar
许多不同文件夹中的多个文件。有些包装有点不同,循环会导致问题。
- folder 1
- file.part01.rar
- file.part02.rar
- ...
- folder 2
- file.r01
- file.r02
- file.rar
- folder 3
- file1.rar
- file2.rar
- ...
完成或类似的操作后for f in *.rar; do unrar e $f;done
,它会进入循环并继续解压缩已经完成的文件。这是因为part01.rar
&part02.rar
都是rar文件并且满足命令。
我能做些什么来阻止这个循环吗?
我有 50 多个文件夹,因此不想单独浏览所有文件夹。
答案1
partN.rar
听起来您想排除以whereN
大于 1结尾的文件。使用zsh
:
set -o extendedglob
for file (./**/(^*part<2->).rar(N.)) echo unrar e $file
echo
当对它的作用感到满意时,将其移除。
对于bash
,情况有点复杂:
(export LC_ALL=C; shopt -s extglob globstar nullglob
for file in ./**/!(*part*(0)@([2-9]|[1-9]+([0-9]))).rar; do
[ -f "$file" ] || continue
[ -L "$file" ] && continue
echo unrar e "$file"
done)
或者使用 GNU find
:
LC_ALL=C find . -name '*.rar' -type f -regextype egrep \
! -regex '.*part0*([2-9]|[1-9][0-9]+)\.rar' \
-exec echo unrar e {} \;
(这也考虑隐藏的 rar 文件或隐藏目录中的 rar 文件)。
unrar l
或者您可以尝试解析文件的输出,以确定哪些是单卷存档或多卷存档的第一个卷。
这里用 unrar 5.61 进行了测试rarlab.com在版本 5 RAR 存档上(假设没有名为 的存档$'whatever\nDetails: whatever.rar'
),其中zsh
:
is_first_volume() {
unrar l "${1-$REPLY}" 2>&1 | awk '
/^Details: / {
is_rar = /RAR/
if (/volume/) volume = $NF
exit
}
END {
if (!is_rar || volume > 1) exit 1
}'
}
for file (./**/*.rar(N.+is_first_volume)) echo unrar e $file
答案2
也许尝试:
find . -type f -name '*.rar' -print0 | xargs -0I{} unrar e {}
答案3
如果我正确理解你的问题,你想拍摄文件的快照.rar
,仅解压缩这些文件并且不要解压缩.rar
rar 文件原始快照中的任何其他文件。
# put all files currently in the directory in a variable
csc_rarfiles=(*.rar)
# now iterate over the files contained in the array and unrar only those
for f in "${csc_rarfiles[*]}"; do unrar e "$f"; done
答案4
unrar e -r -o- *.rar
奇迹般有效。就是解压到当前目录,你也可以添加一个目标目录,将所有文件解压到那里。