왜 이 표현식을 unrar 확장할 수 없나요?

왜 이 표현식을 unrar 확장할 수 없나요?

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\*rarunrar 프로그램은 사용자가 입력할 때 텍스트 문자열을 받습니다 file*rar. 를 입력하는 것이 더 쉬울 수 있으며 unrar x file*rar, 그러면 쉘이 패턴을 확장하게 됩니다( unrar 패턴과 일치하는 파일 목록을 받게 됩니다).

자, unrar x file\*rar예를 들어 작동하지 않는 이유는 무엇 unrar x file\*.rar입니까? 내 생각에는 unrar패턴 확장을 수행하는 자체 코드가 포함되어 있고 쉘이 이를 수행하지 않는 시스템에서 실행되며 규칙이 Unix와 다르다는 것입니다. 내 기억이 맞다면 이는 MS-DOS의 규칙을 준수하는 *rar것입니다 .아니요이름이 .로 끝나는 파일과 일치합니다 .rar.

관련 정보