将包含在archive.tar.gz中的文件提取到名为archive的新目录中。

44

我有一个包含大约800个.tgz压缩文件的目录,每个文件夹中包含约10个文件。我想将每个压缩文件转换成同名的目录。是否有一个简单的一行命令可以完成这个任务,还是我需要编写一个脚本?


您可以在命令本身中指定 tar -xvzf filename.tar.gz -C /desired/path - Aravind.HU
4
如果目录不存在,则-C选项无法正常工作。更好的做法是:mkdir -p dirpath && tar xzf archive.tar.gz -C dirpath。该命令先创建目录,然后在指定目录下解压缩文件,确保执行成功。 - Noam Manos
5个回答

42
自GNU tar 1.28以来的更新: 使用--one-top-level,请参见https://www.gnu.org/software/tar/manual/tar.html#index-one_002dtop_002dlevel_002c-summary 旧版本需要编写脚本。您可以通过使用tar -C选项指定提取所放置的目录。
下面的脚本假定目录不存在且必须创建。如果目录存在,则脚本仍将起作用- mkdir将简单地失败。
tar -xvzf archive.tar.gx -C archive_dir

例如

for a in *.tar.gz
do
    a_dir=${a%.tar.gz}
    mkdir --parents $a_dir
    tar -xvzf $a -C $a_dir
done

是的,我想我可能需要一个脚本 - 感谢确认。 - si_2012
脚本运行良好,但我需要添加“mkdir $a_dir”。 - cerebrou

20
如果考虑现代化的GNU tar,那么这里应该是最佳答案: https://unix.stackexchange.com/a/478341/34069 为简洁起见,以下是摘录:
tar -xvf bash.html_node.tar.gz --one-top-level

它会将存档文件解压到以存档文件名命名的新目录中。

不应该,--one-top-level 在 GNU 版本的 tar 中不存在。这意味着它在 OSX 和某些版本的 Linux 上不受支持。 - Ian Smith
3
@IanSmith - 好的,说得好 - 但你可能是指“在BSD版本中不存在…” - yatsek
是的 :), 它肯定应该被包括在内。 - Ian Smith
5
GNU tar 1.28版本于2014年7月28日发布,增加了选项“--one-top-level”,具体信息请参见此处的发布说明:https://www.gnu.org/software/tar/。 - Johannes Müller

4

创建一个文件夹,用于解压缩,命令如下:mkdir archive,解压缩时使用-C参数并指定文件夹名称,命令如下:tar -xvf archive.zip -C archive


0

从一个目录提取文件到第二个目录,同时在第二个目录中保留文件名,即不包括完整的文件路径和文件扩展名。

%sh
for file in /mnt/dir1/*.tar.gz; 
do 
y=${file##*/}; 
z=${y%%.*}; 
mkdir -p /mnt/dir2/$z && tar -xzvf $file -C /mnt/dir2/$z;
done

-4

嗯,如果你运行$ tar -zxf some-archive.tar.gz -C .(注意末尾的点),一个名为some-archive/的新目录将会在当前目录下创建。

也许这就是你在问题中所指的?这通常是我想要的,所以对你也可能适用。


1
虽然这是正确的,但它并没有回答问题。 -C .是多余的,因为默认的输出直接是当前目录。 - David Cook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接