您好,我有多个 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
它不起作用有两个原因:
- 由于您在单引号内使用
--transform
表达式,因此扩展被禁用。 - 您使用 glob 的方式是错误的
for f in *; do tar -xvf "$f.tar"...
意味着*
匹配整个文件名,例如1.tar
so$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
这正是我想要的