再帰的にファイルを解凍するには?

再帰的にファイルを解凍するには?

zipとrarを含む大容量ファイルがあります。zipとrarファイルはLinuxシステムにあります。

デフォルトでは、ディレクトリを再帰的に検索し、見つけたrarまたはzipを解凍して解凍するスクリプトまたは単一のライナーが必要です。

答え1

誰かがシェルスクリプトを使用してこの問題を解決した方法は次のとおりです。

http://www.dbforums.com/unix-shell-scripts/1619154-how-unzip-files-recursively.html

Linuxには再帰的な解凍オプションがないようです。

答え2

私が考えることができる唯一の方法は、findを使用して何度も繰り返し、ファイルが正しく解凍された後にファイルを削除するスクリプトを実行することです。サブディレクトリを複数回渡す必要があるため、それほど効率的ではありません。 (予想されるファイル名は上部に太字で表示されています)

再帰的アンパッキング

#!/bin/bash
if [ -d "$1" ]; then
   STARTDIR="$1"
else
   echo "starting dir not found: $1"
   exit
fi


COUNTER=1
while [ $COUNTER -gt 0 ]; do
   COUNTER=`find "$STARTDIR" -type f \( -iname '*.zip' -o -iname '*.rar' \) -exec ./unpacker \{\} \; | wc -l`
done

アンパッカー

#!/bin/bash
BASENAME=`basename "$1"`
BASEDIR=`dirname "$1"`

cd "$BASEDIR"
EXT=`echo "$BASENAME" | awk -F . '{print $NF}'`

if [ "$EXT" = "zip" ]; then
  unzip -qq "$BASENAME"
  if [ $? -eq 0 ]; then
     echo "zip unpacked: $1"
     rm "$BASENAME"
  fi
fi

if [ "$EXT" = "rar" ]; then
  unrar e -y -c- -inul "$BASENAME"
  if [ $? -eq 0 ]; then
     echo "rar unpacked: $1"
     rm "$BASENAME"
  fi
fi

する

chmod u+x recursive_unpack
chmod u+x unpacker

呼ぶ./recursive_unpack "/my/directory/containing/my/files"

  • recursive_unpackは、解凍が同じディレクトリにあると予想します。
  • unrarそしてunzipインストールする必要があります
  • ディレクトリが見つからない場合、エラーが発生して終了します。
  • アンパッカーからエコーメッセージを削除しないでください。ループを終了するためにアンパックするファイルが存在することを確認するために使用されます。

答え3

簡単に言えば、アーカイブが抽出されたことを確認しません。

$ find . -name '*.rar' -execdir unrar e '{}' + && find . -name '*.zip' -execdir unzip -tq '{}' +

答え4

rar部分ファイルがある場合は、* .rarと一緒にそのファイルを削除したい場合があります。これを行うには、以下を追加できます。

find "$BASENAME" -regex '.*\.r[0-9][0-9]' -delete

ここで:

  if [ $? -eq 0 ]; then
     echo "rar unpacked: $1"
     rm "$BASENAME"
     # HERE
  fi

したがって、bashはいくつかのファイルも削除します。

関連情報