解压缩子目录中的所有内容而不进入循环

解压缩子目录中的所有内容而不进入循环

所以我一直在尝试解压缩.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,仅解压缩这些文件并且不要解压缩.rarrar 文件原始快照中的任何其他文件

# 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

奇迹般有效。就是解压到当前目录,你也可以添加一个目标目录,将所有文件解压到那里。

http://www.beginninglinux.com/home/data-compression/unrar-all-files-from-multiple-subdirectories-at-once

相关内容