我在解压目录中的.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
谁知道如何同时解开所有包?
答案 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