我正在尝试创建一个 shell 脚本,其中命令列出了所有可读可执行我或当前用户允许的文件,无论用户是谁以及用户位于何处。因此,即使我将来更改权限,更改仍然会反映出来。
这是我到目前为止所拥有的:
user=`id -un`
group=`id -gn`
IFS='
'
for file in `ls -al /home/cg/root`; do
perm=$(echo $file | awk '{print $1}')
fileowner=$(echo $file | awk '{print $3}')
filegroup=$(echo $file | awk '{print $4}')
ownerreadbit=${perm:1:2}
ownerexecbit=${perm:3:4}
groupreadbit=${perm:4:5}
groupexecbit=${perm:6:7}
worldreadbit=${perm:7:8}
worldexecbit=${perm:9:10}
if ["$user"=="$fileowner" && "$ownerreadbit"=="r" && "$ownerexecbit"=="x"]; then
echo $file
elif ["$group"=="$filegroup" && "$groupreadbit"=="r" &&" $groupexecbit"=="x"]; then
echo $file
elif ["$worldreadbit"=="r" && "$worldexecbit"=="x"]; then
echo $file
fi
done
答案1
为什么不使用 GNUfind
命令?
find /home/cg/root -readable -executable
或者只列出文件:
find /home/cg/root -readable -executable -type f
答案2
用户 IporSricer 的答案find /home/cg/root -readable -executable
是正确的选择。另请注意,该find
命令还有一个额外的优点,即能够自定义其输出的格式,包括包含有关每个文件的许多可能详细信息的选项。请参阅页面-printf
中的选项man
。此答案的主要目的是尝试为您未来的脚本问题提供有用的反馈。
不要使用 的输出
ls
来编写脚本!这是初学者常见的错误。参考为什么*不*解析`ls`?不使用
ls
,只需使用 shell 的本机文件通配,例如。/home/cg/root/*
。这就是该功能存在的(原因之一)。您的脚本不会下降到子目录,但用户 IporSricer 的答案会下降。
您错误地使用了 shell 的子字符串扩展功能,因此您的所有测试都不起作用。第二个参数是一个子字符串长度,不是结束位置,因此
${perm:1:2}
返回两个字符的子字符串;您想要${perm:1:1}
单个字符子字符串。更快的测试是定义表单的单独变量
owner=${perm:1:2}
,然后针对“rx”测试它们。我很惊讶你似乎说它
&&
在测试命令中有效[
;我认为它只能在[[
.由于您的所有三个
if
,elif
,elif
都在做相同的事情, an ,您可以使用逻辑“或”运算符(在测试之外)echo
将它们组合成一个。if
||
[
希望这有用。