안녕하세요, 1.tar 2.tar 3.tar..etc와 같은 tar 파일이 여러 개 있고 이를 각각의 폴더(예: 1.tar를 1이라는 폴더에 추출하는 등)에 추출하고 싶습니다. 내 평가판은 다음과 같습니다. :
for f in *; do
tar -xvf "$f.tar" --xform='s|^|$f/|S';
done
예상대로 작동하지 않습니다. 어떻게 해야 합니까?
답변1
다음 두 가지 이유로 작동하지 않습니다.
- 작은따옴표 안에 표현식을 사용하고 있으므로
--transform
확장이 비활성화됩니다. - glob을 사용하는 방식이 잘못되었다는 것은 전체 파일 이름이 일치한다는 것을
for f in *; do tar -xvf "$f.tar"...
의미합니다 . 예를 들어 확장되면 잘못된 결과가 발생할 가능성이 높습니다.*
1.tar
$f.tar
1.tar.tar
No such file or directory
다음과 같이 시도해 보세요:
for f in *.tar
do
tar -tf "$f" --xform="s|^|${f%.*}/|S" --show-transformed-names
done
출력이 만족스러우면 dry-run 명령을 다음으로 바꿉니다.
tar -xf "$f" --xform="s|^|${f%.*}/|S"
이 특별한 경우에는 간단히 실행할 수 있지만
for f in *.tar; do tar -xf "$f" --one-top-level; done
답변2
--xform
/는 --transform
GNU 확장입니다. 일부 tar
구현에서는 -s
이를 수행합니다(표준 에서와 동일 pax
).
여기서 tar
대신 GNU를 사용하면 이를 위해 설계된 것을 --xform
사용할 수 있습니다 .--one-top-level
for f in *.tar; do
tar --one-top-level="${f%.tar}" -xf "$tar"
done
.tar
(현재 디렉토리에 이름이 다음으로 끝나는 숨김되지 않은 파일이 하나 이상 있다고 가정) 또는 다음을 사용하십시오 zsh
.
for f (*.tar(N)) tar --one-top-level=$f:r -xf $f
답변3
나는 다음과 같이 작동하게 만들었습니다.
for t in *.tar ; do
bn="$(basename -- "$t" .tar)"
mkdir -p -- "$bn" &&
tar -xf "$t" -C "$bn"
done
이게 바로 내가 원하는 거야