在 Linux 中查找文件,但有一些例外

在 Linux 中查找文件,但有一些例外

我正在尝试创建一个命令,该命令将找到过去 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 系统上使用uconvrecode

{ 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

相关内容