폴더에서 여러 tar 파일과 해당 파일 이름을 추출합니다.

폴더에서 여러 tar 파일과 해당 파일 이름을 추출합니다.

안녕하세요, 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

다음 두 가지 이유로 작동하지 않습니다.

  1. 작은따옴표 안에 표현식을 사용하고 있으므로 --transform확장이 비활성화됩니다.
  2. glob을 사용하는 방식이 잘못되었다는 것은 전체 파일 이름이 일치한다는 것을 for f in *; do tar -xvf "$f.tar"...의미합니다 . 예를 들어 확장되면 잘못된 결과가 발생할 가능성이 높습니다.*1.tar$f.tar1.tar.tarNo 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/는 --transformGNU 확장입니다. 일부 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

이게 바로 내가 원하는 거야

관련 정보