![在Linux上以递归方式存档文档树中的小文件?](https://linux22.com/image/527719/%E5%9C%A8Linux%E4%B8%8A%E4%BB%A5%E9%80%92%E5%BD%92%E6%96%B9%E5%BC%8F%E5%AD%98%E6%A1%A3%E6%96%87%E6%A1%A3%E6%A0%91%E4%B8%AD%E7%9A%84%E5%B0%8F%E6%96%87%E4%BB%B6%EF%BC%9F.png)
给定一个基本目录(如/home/user
),是否有可以运行的命令,该命令将创建一个存档,备份该目录及其子目录中的所有文本文件(即小于 100kb 的文件)?我知道你可以 tar/gz 一个目录 - 但如何排除文件呢?
这个想法是,大多数照片、视频和其他大文件将被忽略,而所有重要的手写文档在移动项目和服务器时都可以轻松快速地备份。
更新
使用 skinp 的出色代码,我能够备份少量文件。但是,正如 DerfK 指出的那样 - 传递给命令的参数大小是有限制的。考虑到这一点,我能够写出内容,希望find
我可以使用某种东西来读取内容tar
并绕过此限制。另一个选项似乎是 sh 脚本,它可以一次将每个文件添加到存档中。
find /home/username -type f -size -100k > list.of.small.files.txt
其渲染出一个 6MB 的文件。
答案1
查看到目前为止发布在这里的其他答案,我担心我看到的xargs
和的使用find -exec {}
是错误的。如果文件列表变得足够长,以至于tar -c
被执行xargs
多次,那么填充到该点的 tar 文件将被覆盖。因此,只有来自最后一次调用的文件tar
才会出现在 tarfile 中。
这是一个始终有效的单行代码,无论文件总数是多少,也无论文件名是否包含嵌入的换行符:
find /home/user -type f -size -100k -print0 | tar -c -z --null --files-from=- -f backup.tgz
该find
命令生成要备份的以空字符结尾的文件名列表,然后tar
从管道中读取该列表并创建 tarfile backup.tgz
。
答案2
尝试
find /home/user -type f -size -100k -print0 | xargs -0 tar cvzf tarfile.tar.gz
对于名称中带有空格的文件来说这也是安全的。
答案3
我会利用查找功能:
find /home/user -type f -size -100k -exec tar cvzf backup.tgz {} \+
类型:指定你想要一个文件而不是一个目录
大小:数字前面带有 -,表示我们想要小于 100k
exec:执行 tar,其中 {} 表示找到的文件,\+ 表示 exec 结束
您也可以使用 xargs:
find /home/user -type f -size -100k | xargs tar cvzf backup.tgz
更新:
tar 作为命令将文件附加到现有的 tar 存档(甚至可能不存在,但对我来说有效)。
这是一个执行此操作的简单示例脚本:
find . -type f -size -100k -print > filelist
for i in `cat filelist`
do
tar --append $i --file=backup.tar
done
gzip backup.tar
显然,这个脚本效率极低……它每次只能附加一个文件,有多少个文件就启动多少次 tar 命令。
最好编写一个脚本,每次附加 1000 个文件……