检查目录是否已更改

时间:2014-01-15 09:05:54

标签: linux bash directory

我正在编写备份脚本,但我遇到了问题。我想将我的文档备份到ftp服务器。因为我不喜欢encfs所以我尝试通过使用z-zip和加密档案来实现这一点。这工作得很好但我想只在子目录中的文件发生变化时创建一个新的存档,所以lftp只上传更改后的文件。

我的codesnippet看起来像这样:

cd /mnt/HD_a2/documents
for i in */
do 7za a -t7z /mnt/HD_a2/encrypted/ul_doc/"${i%/}.7z" -p1234 -mhe "$i" 
done

如何更改此代码,以便在过去7天内更改“i”内的文件时才创建新的存档? (此脚本每7天由cron执行一次)

2 个答案:

答案 0 :(得分:2)

for i in */
do 
    if [ `find "$i" -type f -mtime -7 | wc -l` -gt 0 ]
    then 7za a -t7z /mnt/HD_a2/encrypted/ul_doc/"${i%/}.7z" -p1234 -mhe "$i" 
    fi
done

答案 1 :(得分:0)

因此,Barmar`s answer几乎是正确的,但它不能正确计算文件。我一直在寻找其他类似的问题,这似乎是一个常见的错误(请注意,这对他的解决方案并不重要,但如果他们触摸它可能会让其他程序员感到困惑,因为它不是最重要的人们会期待),没有人会认为文件名可以包含换行符。所以这里有一个更好的版本,可以为您提供正确的文件数:

for i in */
do
    fileCount=$(find "$i" -type f -mtime -8 -exec printf . \;)
    if (( ${#fileCount} > 0 )); then
        7za a -t7z /mnt/HD_a2/encrypted/ul_doc/"${i%/}.7z" -p1234 -mhe "$i" 
    fi
done

但是如果你有成千上万的文件怎么办?这将构建一个与文件数量完全一样长的字符串。

所以我们可以用这个:

for i in */
do
    fileCount=$(find "$i" -type f -mtime -8 -exec printf . \; | wc -c)
    if (( fileCount > 0 )); then
        7za a -t7z /mnt/HD_a2/encrypted/ul_doc/"${i%/}.7z" -p1234 -mhe "$i" 
    fi
done

或者这个:

for i in */
do
    fileCount=$(find "$i" -type f -mtime -8 -exec echo \; | wc -l)
    if (( fileCount > 0 )); then
        7za a -t7z /mnt/HD_a2/encrypted/ul_doc/"${i%/}.7z" -p1234 -mhe "$i" 
    fi
done

希望无法缓存无用的字符串数据。

但我们只需要知道是否有至少一个文件,我们不必统计所有这些文件!这样我们可以立即停止,如果找到了什么。

for i in */
do
    fileFound=$(find "$i" -type f -mtime -8 | head -n 1)
    if [[ $fileFound ]]; then
        7za a -t7z /mnt/HD_a2/encrypted/ul_doc/"${i%/}.7z" -p1234 -mhe "$i" 
    fi
done

就是这样。此解决方案将更快地工作,因为它不必查找其他文件,甚至不必检查他们的mtime。尝试在没有head的情况下运行此代码,您会发现一个显着的差异 - 从我的主文件夹的几小时到不到一秒。 (我甚至不确定它是否能够在我的电脑上完成它,我的家庭文件夹中有数百万个小文件......)