Filetype的Bash脚本TAR不会在递归命令上压缩指定的文件类型

时间:2013-06-27 11:22:15

标签: bash find tar xargs xbmc

简单地说,我在网络上进行了详尽的库更新,以便与XBMC兼容。现在已经完成了,我认为定期备份我的电视节目文件夹中各种目录和子目录中的nfo,bub,srt,jpg,tbn文件(除了任何视频文件之外的所有内容)都没有坏处。我还想按日期压缩它。在玩完之后,我让这个半工作:

find '/volume2/MyMedia/TV Shows/' -type f \( -name \*\.sub -o -name \*\.srt -o -name \*\.nfo -o -name \*\.jpg -o -name \*\.tbn \) -print0 | xargs -0 tar -pvczf '/volume2/Backups/XBMC Backups/'XBMC-TVShows-NFO-JPG-TBN-SUB-Backup-$(date +%m-%d-%y).tar.gz

它通过动作(扫描每个目录并查找文件),我看到zip文件增长,但随后突然tar.gz下降到0字节并再次计数。一旦它到达一个新目录进行扫描,我认为它正在这样做。

最后,我得到一个1.8MB的文件,只有最后扫描的目录。在其中,几乎所有内容,除了它省略了1个子目录。 IE:它压缩了'30 Rock'以及我指定的所有文件,但是,它除了第2季以外的所有文件夹都有。

所以我不知所措。代码中的一切看起来都很清楚。由于某种原因,它运行不正常。我想我现在对这个项目有洞察力。一双新鲜的眼睛会很壮观!

以下是输出:http://pastebin.com/ywctQ5Sf

以下是最终的tar.gz:http://s23.postimg.org/6pc22h7yz/output.png

最后注意事项:它备份的节目目录中确实有空格。所以有一个像这样的目录结构:

>volume2
->MyMedia
-->TV Shows
--->Fullmetal Alchemist Brotherhood
---->Season 1
----->Fullmetal Alchemist Brotherhood.S01E01.Fullmetal Alchemist.nfo

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这是因为xargs多个 tar命令之间拆分了大量文件,每个命令都尝试创建一个新文件。尝试使用-A选项而不是-vczf ...并将整个命令传递给gzip

find ... -print0 | xargs -0 tar -A | gzip - > "....tar.gz"

答案 1 :(得分:0)

所以在重新审视之后,我尝试了l0b0的方法。它回来了:

tar: Options `-Aru' are incompatible with `-f -'

所以我调查了另一种方式并提出了这个脚本:

#!/bin/bash
find /volume1/Media/TV\ Series/ -iname "*.sub" -exec tar rvfP /volume1/Backups/TestBackup.tar {} \;
find /volume1/Media/TV\ Series/ -iname "*.srt" -exec tar rvfP /volume1/Backups/TestBackup.tar {} \;
find /volume1/Media/TV\ Series/ -iname "*.nfo" -exec tar rvfP /volume1/Backups/TestBackup.tar {} \;
find /volume1/Media/TV\ Series/ -iname "*.jpg" -exec tar rvfP /volume1/Backups/TestBackup.tar {} \;
find /volume1/Media/TV\ Series/ -iname "*.tbn" -exec tar rvfP /volume1/Backups/TestBackup.tar {} \;
gzip /volume1/Backups/TestBackup.tar

这需要很长时间,但我让它在半夜运行时没有其他任何事情发生,并且它有效。无论如何,我只需要很少运行这个备份。

如果你如此倾向,你也可以添加一个经过时间的计时器:

#!/bin/bash
date1=$(date +"%s")
# Script stuff here. Uncommented...
date2=$(date +"%s")
diff=$(($date2-$date1))
echo "$(($diff / 60)) minutes and $(($diff % 60)) seconds elapsed."