解压目录中的.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