![루프를 입력하지 않고 하위 디렉터리의 모든 항목을 압축 해제합니다.](https://linux55.com/image/141656/%EB%A3%A8%ED%94%84%EB%A5%BC%20%EC%9E%85%EB%A0%A5%ED%95%98%EC%A7%80%20%EC%95%8A%EA%B3%A0%20%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%ED%95%AD%EB%AA%A9%EC%9D%84%20%EC%95%95%EC%B6%95%20%ED%95%B4%EC%A0%9C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
.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
N
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
기적적으로 작동합니다. 현재 디렉터리로 추출하기만 하면 대상 디렉터리를 추가하고 거기에 있는 모든 파일을 추출할 수도 있습니다.