Cod*_*der 7 linux bash command-line tar find
通常我会做这样的事情:
tar -czf archive.tar.gz *.csv
Run Code Online (Sandbox Code Playgroud)
但是当目录中有太多文件供 shell 在一行上展开时,这不起作用。
在这些情况下,我通常会求助于使用find. 就像是:
find /path -name '*.csv' -exec tar -rf "./archive.tar.gz" {} +;`
Run Code Online (Sandbox Code Playgroud)
但这似乎只有在我不包含该-z选项时才有效,因为您无法附加到压缩档案,并且使用-c代替-r将覆盖第一个档案,因为 find 多次运行 tar 。
我能想到的唯一其他解决方案是使用find(如上)创建一个 .tar 文件,然后使用第二个命令来压缩它。有没有更好的方法来处理这样的情况?
我正在使用 Ubuntu Linux。
slh*_*hck 11
作为一个强大的解决方案,使用find空字符分隔文件名,然后直接通过管道连接到tar,它读取以空分隔的输入:
find . -maxdepth 1 -name '*.csv' -print0 |
tar -czf archive.tgz --null -T -
Run Code Online (Sandbox Code Playgroud)
这现在将正确处理所有文件名,并且也不受文件数量的限制。
使用ls生成要被另一个程序解析的文件名列表是一种常见的反模式,应尽可能避免。find可以生成-print0大多数实用程序可以进一步读取或解析的空分隔输出 ( )。由于空字符是唯一不能出现在文件名中的字符(/显然还有 ),因此您始终可以放心。
不,您不能在没有先解压缩的情况下附加到压缩的 tar 文件。
但是, tar 可以接受其要从 file 处理的文件列表,因此您可以执行以下操作:
ls *.csv > temp.txt
tar -zcf ball.tgz -T temp.txt
Run Code Online (Sandbox Code Playgroud)
@slhck 指出,如果文件名中有空格(可能还有其他烦人的字符),则上述解决方案将不起作用。此版本将每个文件名括在双引号中:
ls *.csv | sed -e 's/^\(.*\)$/"\1"/' > temp.txt
tar -zcf ball.tgz -T temp.txt
Run Code Online (Sandbox Code Playgroud)
(如果您的文件名中有双引号,这当然会中断,在这种情况下,您会得到应得的。:)