有选择地将 gzip 压缩档案的文件提取到新目录中,该目录的名称源自档案的文件名

有选择地将 gzip 压缩档案的文件提取到新目录中,该目录的名称源自档案的文件名

我有一个文件夹,其中包含数千个 gzip 压缩存档文件,其中包含多个 XML 文件。现在我需要一个脚本,它循环遍历所有存档文件,并有选择地将具有特定文件名的文件(即 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 限制 shell),您可以执行以下操作:

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

相关内容