재귀적으로 파일의 압축을 푸는 방법은 무엇입니까?

재귀적으로 파일의 압축을 푸는 방법은 무엇입니까?

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는 일부 파일도 삭제합니다.

관련 정보