선택적으로 gzip으로 압축된 아카이브의 파일을 아카이브의 파일 이름에서 파생된 이름의 새 디렉터리에 추출합니다.

선택적으로 gzip으로 압축된 아카이브의 파일을 아카이브의 파일 이름에서 파생된 이름의 새 디렉터리에 추출합니다.

여러 XML 파일이 포함된 수천 개의 gzip 압축 아카이브가 포함된 폴더가 있습니다. 이제 모든 아카이브 파일을 반복하고 특정 파일 이름(예: fileofinterest.xml)을 가진 파일을 디렉토리에서 gzip 압축 아카이브를 사용하여 생성해야 하는 파일 이름(확장자 tar.gz 없음)으로 선택적으로 추출하는 스크립트가 필요합니다.

따라서 다음은 gzip 압축 아카이브 파일이 포함된 아카이브 디렉터리와 빌드 디렉터리 및 추출된 파일이 포함된 원하는 출력 디렉터리의 예입니다.

home/
├─ archives/
│  ├─ archive.20.01.tar.gz
│  ├─ archive.20.02.tar.gz
├─ extracted/
│  ├─ archive.20.01/
│  │  ├─ fileofinterest.xml
│  ├─ archive.20.02/
│  │  ├─ fileofinterest.xml

이것은 지금까지의 코드이며 디렉터리 생성이 완전히 누락되었습니다.

for f in ./*.tar.gz; do echo "Processing $f"; tar -x -f $f -C ../extracted/ fileofinterest.xml; done

답변1

bash(ash 또는 유사한 POSIX 제한 쉘이 아님)를 사용하는 경우 다음을 수행할 수 있습니다.

for f in ./*.tar.gz; do
  dir="../extracted/${f/%.tar.gz}"
  mkdir -p "$dir"
  echo "Processing $f"
  tar -x -f "$f" -C "$dir" fileofinterest.xml
done

참고: $dir비슷한 값을 가지지 ../extracted/./archive.20.01만 (미적인 측면과는 별개로) 문제가 되지 않습니다. ./경로에 있는 추가 디렉터리는 사실상 무시됩니다. 귀찮다면 dir=${dir/\/.\//\/}앞에 추가하세요 mkdir -p.

그렇지 않으면 다음을 사용할 수 있습니다 basename.

for f in ./*.tar.gz; do
  dir="../extracted/$(basename "$f" .tar.gz)"
  mkdir -p "$dir"
  echo "Processing $f"
  tar -x -f "$f" -C "$dir" fileofinterest.xml
done

답변2

테스트되지 않았지만 올바른 방향으로 나아갈 수 있어야 합니다.

for f in *.tar.gz; 
do 
    echo "Processing $f"
    BaseName=${f::-6}
    mkdir ../extracted/$BaseName
    tar -x -f $f -C ../extracted/$BaseName fileofinterest.xml
done

관련 정보