根据文件类型正确设置执行位?

4 linux filesystems acl permissions find

我正在尝试清除 Apache Web 服务器上的权限。我发现很多带有执行位的文件通常没有(或不应该有):

$ sudo find /var/www/html -executable -type f | grep '.png'
/var/www/html/.../jquery.ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png
/var/www/html/.../jquery.ui/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
/var/www/html/.../jquery.ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png
...
Run Code Online (Sandbox Code Playgroud)

如何为通常具有它的常规文件(如程序、PHP 页面和 Bash 脚本)设置执行位;并从通常没有它的常规文件(如 TXT、PNG、JPG 和 ZIP 文件)中删除它?

我觉得find有一个-execchmod应该发挥作用的地方。我也希望选择机制会考虑到 shebangs 和其他魔术头;而不仅仅是依赖 [可能不正确] 执行位或 [可能丢失] 扩展。但我的搜索并没有找到正确的答案。参见,如何在 Linux 中只找到某个目录下的可执行文件?递归查找可执行文件

Joh*_*024 6

这将遍历您的文件并根据是否file认为文件应该是可执行的来设置可执行位:

find /var/www/html -type f -exec bash -c 'if file -b "$1" | grep -q executable; then chmod +x "$1"; else chmod -x "$1"; fi' None {} \;
Run Code Online (Sandbox Code Playgroud)

find命令与您的非常相似。更改是添加了 bash 命令。如果它们像这样分布在多行上,可能更容易理解它们:

if file -b "$1" | grep -q executable
then
    chmod +x "$1"
else
    chmod -x "$1"
fi
Run Code Online (Sandbox Code Playgroud)

当然,您可以修改chmod参数以满足您的特定需要。