在文件夹中提取多个 tar 文件及其相应的文件名

在文件夹中提取多个 tar 文件及其相应的文件名

您好,我有多个 tar 文件,例如 1.tar 2.tar 3.tar..etc,我想将它们提取到相应的文件夹,即 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.tarso$f.tar被扩展为1.tar.tar最有可能导致错误的结果No 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/--transform是 GNU 扩展。一些tar实现-s为此(与标准中相同pax)。

在这里,使用 GNUtar代替--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

这正是我想要的

相关内容