35

我有一个包含大约 800 个 .tgz 档案的目录,每个档案包含大约 10 个文件。实际上,我想将每个存档转换为同名目录。是否有一个简单的单行命令来执行此操作,或者我应该编写一个脚本?

4

5 回答 5

37

自 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
于 2013-02-21T17:44:17.980 回答
11

如果GNU tar考虑到足够现代,那么这应该是这里的最佳答案:https ://unix.stackexchange.com/a/478341/34069

为简洁起见,这是摘录:

tar -xvf bash.html_node.tar.gz --one-top-level

它将存档提取到以存档文件名命名的新目录中。

于 2019-12-10T10:52:29.277 回答
3

创建一个要像这样提取的mkdir archive 文件夹,并在提取时使用 -C 传递文件夹名称, tar -xvf archive.zip -C archive

于 2018-10-23T08:54:56.953 回答
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
于 2020-12-24T20:57:31.523 回答
-3

好吧,如果你运行$ tar -zxf some-archive.tar.gz -C .,(注意最后的点)一个名为的新目录some-archive/将在你当前所在的目录中创建。

也许这就是你的问题的意思?这是我通常想要的,所以它也可能对你有用。

于 2015-09-12T22:14:15.330 回答