file1.rar
동일한 디렉토리에 , file2.rar
및 3개의 RAR 파일이 있습니다 file3.rar
. 확장을 사용하여 하나의 명령을 통해 파일을 추출하고 싶습니다. 별표는 , 등의 매개변수 unrar
에서 unzip
이스케이프되어야 한다는 점을 기억하세요 7z
.
나는 다음 명령을 시도했습니다.
unrar x file\*rar
결과 :
UNRAR 5.00 beta 8 freeware Copyright (c) 1993-2013 Alexander Roshal
No files to extract
그러나 이 명령은 작동합니다.
unrar x file\*
이 명령은 작동합니다:
ls file*rar
결과는 다음과 같습니다
file1.rar file2.rar file3.rar
그렇다면 첫 번째 명령이 작동하지 않는 이유는 무엇입니까?
답변1
unrar x '*.rar'
이것은 나에게 효과적이었고 같은 문제가있었습니다.
'를 생략하면 unrar는 동일한 명령줄에 모든 파일을 추가하려고 시도합니다.
예: 1.rar 2.rar 3.rar이 있는 경우
unrar x *.rar
Linux에 전달되는 명령은 다음과 같습니다.
unrar x 1.rar 2.rar 3.rar
오류가 발생하지만 이렇게 사용하면 '
unrar x '*.rar'
전달된 명령은 다음과 같습니다.
unrar x 1.rar
unrar x 2.rar
.......
답변2
5.2.7(최신 버전)에서도 작동하지 않습니다. 한번 시도해 보시고 unrar x file\*.rar
이전 사항을 기록해두는 것이 좋습니다 rar
. 적어도 5.2.7에서는 코드 경로가 약간 다르며 5.2.7에서는 작동합니다.
왜? 글쎄요, unrar의 소스 코드를 몇 분 동안 검색한 후( match.cpp
시도해보고 싶다면 확인해 보세요!) "Alexander Roshal이 정말, 정말,진짜glob(3)
"대신에"를 사용해야 합니다 . 왜 그렇지 않겠습니까? 아마도 AFAIK의 rar인 Windows에서는 사용할 수 없기 때문일 것입니다.
Windows에서 확장자는 특별하며 코드는 unrar
확장자를 실제로 파일 이름의 일부가 아닌 파일 이름의 일부로 처리하는 것 같습니다. 간단한 최종 후행 확장자는 *
하나와 일치하지만 *
중간 a는 일치하지 않습니다. 이것이 Windows에서 예상되는 동작인지는 확실하지 않지만 Unix에서는 확실히 그렇지 않습니다.
해결책
그러한 깨짐을 처리하는 현명한 방법은 다음과 같습니다.
for f in file*rar; do
unrar x "$f"
done
쉘이 glob을 확장하고 한 번에 하나의 파일을 압축 해제하도록 합니다. 파일 *
이름에 다음이 포함되지 않기를 바랍니다 ...
나는 처음에 그것이 5.2.7에서 작동한다고 말했지만 그것은 틀렸습니다. 테스트할 때 백슬래시를 잃어버렸습니다...
답변3
unrar x file\*rar
unrar 프로그램은 사용자가 입력할 때 텍스트 문자열을 받습니다 file*rar
. 를 입력하는 것이 더 쉬울 수 있으며 unrar x file*rar
, 그러면 쉘이 패턴을 확장하게 됩니다( unrar
패턴과 일치하는 파일 목록을 받게 됩니다).
자, unrar x file\*rar
예를 들어 작동하지 않는 이유는 무엇 unrar x file\*.rar
입니까? 내 생각에는 unrar
패턴 확장을 수행하는 자체 코드가 포함되어 있고 쉘이 이를 수행하지 않는 시스템에서 실행되며 규칙이 Unix와 다르다는 것입니다. 내 기억이 맞다면 이는 MS-DOS의 규칙을 준수하는 *rar
것입니다 .아니요이름이 .로 끝나는 파일과 일치합니다 .rar
.