我怎样才能解开一堆相同的文件夹内的相同的包?

解压目录中的.tar.gz文件列表时出现问题。

在我的目录中,

有很多result.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 

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

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 *.tar.gz | ...

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

  • 使用$file没有引号?

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

  • 使用echo | xargs tar echo | xargs tar

    因为echo会破坏文件名,尤其是名字中有空格的文件名。

在执行while read循环时,几乎总是要使用read -r ,这将防止输入中的反斜杠被解释为转义序列。 如果你有一个名为foo\bar的文件,那么read没有-r情况下读取将不会正确读取它。

编辑:

每个评论,这里是一个解压缩到子目录的方法。

 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 

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

 let n=0 for file in *.tar.gz ; do mkdir -p "$n"; tar xzf "$file" -C "$n" let n=n+1 done 

另一个解决方案,通过谷歌搜索发现。 链接

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

你需要做这样的事情

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

你有没有试过管道?

像这样的东西应该工作:

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 

编辑:避免空白错误“$行”

在你选择你的答案之前,你可能想要确保它正确地处理文件名如:

 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