我正在尝试创建一个命令,该命令将找到过去 24 小时内修改的所有文件,并且这些文件仅是 PHP,带有一个循环来查看每个 public_html 目录并将输出保存到 HTML 文件中,以便我可以每天查看。
for i in `ls /var/cpanel/users`;
do find /home/$i/public_html -type f -ctime -1 -exec ls -ls {} \; >
/home/demo4/public_html/output.html;
done;
但它无法正常工作并且输出不正确..这是仅适用于 1 个帐户的输出,它应该适用于所有帐户
0 -r-xr-xr-x 1 ziaengg ziaengg 0 Jan 12 15:16 /home/ziaengg/public_html/modules/mod_rsflashmatic/xml/rsflashmatic_93.xml 23320 -rw-r--r-- 1 ziaengg ziaengg 23851008 Jan 12 15:25 /home/ziaengg/public_html/error_log
我还想了解如何将结果通过电子邮件发送到任何特定的 ID..
如果我想排除任何包含关键字的文件,我应该添加什么参数cache
。我对此真的很陌生。
答案1
尝试:
cd /var/cpanel/users &&
for i in *
do
find "/home/$i/public_html" -type f ! -iname '*cache*' -ctime -1 -ls
done > /home/demo4/public_html/output.html
笔记:
- 使用
>>
代替>
,否则每次迭代都会覆盖最后一次的输出。或者重定向整个循环的输出,在这种情况下您可以使用>
. - 某些
find
实现有一个-ls
与 非常相似的选项-exec ls -ld {} \;
,因此请在可用的情况下使用它。 - 使用
!
运算符来否定搜索:! -iname '*cache*'
- 如果您
find
不支持非标准-iname
谓词,请-name '*[cC][aA][cC][hH][eE]*'
改为使用。 - 由于这些是用户名,您可以使用
for i in $(ls ..)
,但是更安全使用for i in *
.
答案2
zsh
在 GNU 系统上使用uconv
和recode
:
{ echo '<html><head><meta charset="UTF-8"</head><body><pre>'
users=(/var/cpanel/users/*(:t)) &&
find /home/$^users/public_html -type f -ctime -1 ! -iname '*cache*' -ls |
uconv --from-callback escape-c -f utf8 -t utf8 |
recode u8..html
echo "</pre></body></html>"
} > /home/demo4/public_html/output.html
(但请注意,recode
不支持 U+FFFF 以上的字符)
您需要这些额外的 uconv/recode 步骤来避免文件名中包含<
或&
字符或 8 位字节值的问题(这里我们假设文件名是 UTF-8 编码的(对于无效字符,我们将其字节值显示为\xAB
)