Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 检查目录是否已更改_Linux_Bash_Directory - Fatal编程技术网

Linux 检查目录是否已更改

Linux 检查目录是否已更改,linux,bash,directory,Linux,Bash,Directory,我正在编写备份脚本,我遇到了一个问题。我想将我的文档备份到ftp服务器。因为我不喜欢encfs,所以我尝试通过使用z-zip和加密档案来实现这一点。这是工作得很好,但我想创建一个新的档案,只有当一个子目录内的文件已更改,所以lftp只是上传更改的 我的代码片段如下所示: cd /mnt/HD_a2/documents for i in */ do 7za a -t7z /mnt/HD_a2/encrypted/ul_doc/"${i%/}.7z" -p1234 -mhe "$i" done

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

我的代码片段如下所示:

cd /mnt/HD_a2/documents
for i in */
do 7za a -t7z /mnt/HD_a2/encrypted/ul_doc/"${i%/}.7z" -p1234 -mhe "$i" 
done
如何更改此代码,使其仅在“I”中的文件在过去7天内发生更改时创建新的存档?(cron每7天执行一次此脚本)

因此,这几乎是正确的,但它无法正确计算文件数。我环顾四周,寻找其他类似的问题,这似乎是一个常见的错误(请注意,这对他的解决方案并不重要,但如果其他程序员碰了它,可能会感到困惑,因为这不是大多数人所期望的),没有人会考虑文件名可以包含换行符这一事实。因此,这里有一个更好的版本,可以为您提供正确的文件计数:

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
。尝试在没有
标题的情况下运行此代码,您会注意到一个显著的差异—对于“我的主文件夹”,从几个小时到不到一秒钟。(我甚至不确定它是否能在我的电脑上完成,我的主文件夹中有数百万个小文件…

有换行符的文件怎么样?这对他们很有用。它不使用文件名,只检查
find
是否列出了任何文件名。没错,但它仍然非常低效,因为它必须检查所有文件的
mtime
。请参阅我的答案以获得更好的解决方案谢谢,写下这两种解决方案,这对我来说是一个很好的练习:)为什么需要正确地计算文件数?重要的是零或非零。@Barmar你真的把我的答案读到最后了吗?是的,但许多程序员可能会盲目地认为
wc-l
将为他们提供正确的文件数量,因此我想澄清这一点(您很少会看到计算文件数量的正确解决方案)。后来,在我的答案的最后,我给出了一个更好的解决方案,以查看是否至少有一个文件。幸运的是,
find
没有缓冲其输出,或者该解决方案在退出之前仍会检查大量文件。您的上一个解决方案非常有效,非常感谢@Barmar我很确定它确实缓冲了它的输出,并且检查了stdout是否可写。
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