如何解压同一个文件夹中的一堆相同的包?

时间:2011-08-08 06:13:39

标签: linux bash

我在解压目录中的.tar.gz文件列表时遇到了问题。

在我的目录中,

有很多结果.tar.gz,它们是同一个名字,它们被重命名为......

result.tar.gz
result (1).tar.gz
result (2).tar.gz
result (3).tar.gz
result (4).tar.gz
....
....
....
....

我想在一个linux命令中解压所有这些。 所以我尝试使用

tar zxvf *

tar zxvf result*.tar.gz

都有这个错误

tar: result (3).tar.gz: Not found in archive
tar: result (4).tar.gz: Not found in archive
tar: result (5).tar.gz: Not found in archive
tar: result (6).tar.gz: Not found in archive

谁知道如何同时解开所有包?

5 个答案:

答案 0 :(得分:6)

tar只知道如何一次处理一个.tar文件:用f指定的文件。如果在命令行中指定其他名称,则将它们解释为要从指定的.tar文件中提取的文件。

到目前为止,大多数答案都没有说明不寻常的文件名,例如包含空格,换行符或其他特殊字符的文件名。

正确的答案是:

for file in *.tar.gz ; do
    tar xzf "$file"
fi

另一个可接受的答案是使用find

find . -maxdepth 1 -type f -name '*.tar.gz' -exec tar xzf {} \;`

为什么我不能......

  • 使用ls *.tar.gz | ...

    因为ls会破坏文件名中的某些字符(即,它不安全)。如果你必须使用ls,你应该小心使用ls -1,然后小心你将新行和新行作为记录分隔符。这仍然不安全,但更安全。

  • 使用不带引号的$file

    因为名称中包含空格的文件将以您不期望的方式进行解释。示例:名为monthly backup.tar.gz的文件将被解释为tar xzf monthly backup.tar.gz,您将收到错误,因为存档monthly不存在。

  • 使用echo | xargs tar

    因为echo会破坏文件名,特别是名称中带空格的文件名。

执行while read循环时,您几乎总是希望使用read -r,这将防止输入中的反斜杠被解释为转义序列。如果您有一个名为foo\bar的文件,那么没有read的{​​{1}}将无法正确阅读。

编辑:

根据评论,这是一种将tarball提取到子目录中的方法。

-r

上面我提取到以tarball命名的目录。但是,任何制作唯一目录名的方案都是足够的。例如,这是一个提取到顺序编号目录的版本:

for file in *.tar.gz ; do
    # strip any leading path information from the file name
    name_only="${file##*/}"

    # strip the extension .tar.gz
    without_extension="${name_only%.tar.gz}"

    # make a directory named after the tar file, minus extension
    mkdir -p "$without_extension"

    # extract the file into its own directory
    tar xzf "$file" -C "$without_extension"
done

答案 1 :(得分:3)

另一种解决方案,通过谷歌搜索找到了这个。 link

for i in *.tar.gz; do tar -xvzf "$i"; done

答案 2 :(得分:1)

你尝试过滚边吗?

这样的事情应该有效:

ls *.tar.gz | while read line; do tar -xzvf "${line}"; done

编辑:

此外,tar将在提取时覆盖文件。要避免这种情况,请尝试以下方法之一(来自手册页):

-k, --keep-old-files
      keep existing files; don't overwrite them from archive

--keep-newer-files
      do not overwrite files which are newer than the archive

编辑: 避免空格错误“$ line”

答案 3 :(得分:1)

你需要做这样的事情

echo * .tar.gz | xargs -n 1 tar -zxvf

答案 4 :(得分:1)

在您选择答案之前,您可能需要确保它正确处理文件名,例如:

My brother's 12" records.tar.gz

如果你安装了GNU Parallel:

ls result*.tar.gz | parallel tar zxvf 

如果你喜欢没有管道:

parallel tar zxvf ::: result*.tar.gz

我经常想确保解压缩的文件位于自己的目录中,所以:

ls result*.tar.gz | parallel mkdir {.}\;cd {.}\;tar zxvf ../{}

或:

parallel "mkdir {.};cd {.};tar zxvf ../{}" ::: result*.tar.gz

观看介绍视频以了解详情:http://www.youtube.com/watch?v=OpaiGYxkSuQ