我有一个文件夹,其中包含数千个 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