아카이브 이름을 폴더 이름으로 사용하여 다중 스레드 방식으로 여러 7z 아카이브를 자체 폴더로 추출하는 방법은 무엇입니까?

아카이브 이름을 폴더 이름으로 사용하여 다중 스레드 방식으로 여러 7z 아카이브를 자체 폴더로 추출하는 방법은 무엇입니까?

아카이브 이름을 폴더 이름으로 사용하여 모든 7z 아카이브를 자체 폴더로 추출하려면 다음 명령을 실행합니다.

7z x "*.7z" -o*

a.7z예를 들어, 두 개의 파일 과 가 있는 경우 및 b.7z폴더가 a생성되며, 여기에는 각각 및의 내용이 포함됩니다(디렉토리 구조 유지).ba.7zb.7z

때로는 7z 아카이브가 너무 많아서 여러 코어를 사용하여 이를 추출하고 싶을 때가 있습니다. 나는 이것을 읽었다답변통과아르툠 S.타슈키노프:

7z 압축 해제는 단일 스레드이므로 압축 형식의 제한 사항입니다.

parallel그래서 제 경우에는 7z 아카이브가 여러 개 있기 때문에 그것을 사용할 생각입니다 .

나는 시도했다:

parallel -j4 '7z x {} -o{}' ::: *.7z

a.7z그러나 두 파일과 가 있는 예제 로 돌아가면 b.7z명령은 a.7z두 파일 sum을 and 대신 sum b.7z폴더로 추출하려고 시도합니다 a.7z. 그러면 sum이 이미 가져왔고 파일이기 때문에 실행이 중단됩니다 . 이 문제를 어떻게 해결할 수 있나요? 두 개의 폴더 와 .b.7zaba.7zb.7zab

그게 중요하다면 우분투를 사용합니다.

답변1

parallel{.}대신 다음을 지정하면 확장이 제거됩니다 {}.

parallel -j4 '7z x {} -o{.}' ::: *.7z

답변2

*in 옵션에 대한 참고 사항입니다 -o{dir_path}. 문서에는 다음과 같은 내용이 나와 있습니다.

{dir_path}
이것은 대상 디렉토리 경로입니다. [...] 7-Zip *에서 지정 하면 이 문자가 아카이브 이름으로 대체됩니다.{dir_path}*

초기 명령의 올바른 구문은 다음과 같습니다.

7z x \*.7z -o\*

즉, 두 번째 항목 *도 이스케이프해야 합니다. 그렇지 않으면 쉘이 이를 확장하려고 시도합니다. bash해당 옵션을 사용하지 않고 사용할 수도 있습니다 nullglob. 이것이 작동하는 이유입니다(일치하는 항목을 찾지 못하여 문자 그대로 전달합니다 7z)...


gnu parallel이제 명령을 실행하려면 다음을 사용할 수 있습니다 *(위에서 말했듯이 이스케이프 처리).

parallel -j4 '7z x {} -o\*' ::: *.7z

또는 Stephen's 대답과 같은 대체 문자열을 제거 *하고 사용하십시오 parallel.{.}

관련 정보