여러 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