ループを入力せずにサブディレクトリ内のすべてのエントリを解凍します。

ループを入力せずにサブディレクトリ内のすべてのエントリを解凍します。

.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.rarN1より大きいもので終わるファイルを除外したいようです。使用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

おすすめ記事