我正在尝试编写一个脚本来规范Linux中的权限:
for f in $(find . -type f); do
file "$f" | grep -e "ELF 64-bit LSB executable" -e "ELF 32-bit MSB executable" > /dev/null
if [ $? = 0 ]; then
chmod -c u=rwx,g=rx,o=rx "$f"
else
chmod -c u=rw,g=r,o=r "$f"
fi;
done
显然,我正在尝试将文件路径传递给chmod
,并且我使用双引号,如"$f"
,但不知何故仍然会出现No such file or directory
错误:
chmod: './FreeDesktop_integration/nautilus-scripts/Archiving/PeaZip/Extract''e erişilemedi: Böyle bir dosya ya da dizin yok
chmod: 'Archive''e erişilemedi: Böyle bir dosya ya da dizin yok
似乎./FreeDesktop_integration/nautilus-scripts/Archiving/PeaZip/Extract Archive
被chmod
视为2个文件(这是非常意外的)。
那导致了什么?我如何解决这个问题(正确传递args)?
奖金问题:有没有更好的方法来实现我尝试使用脚本实现的目标?
答案 0 :(得分:1)
在for f in $(find . -type f)
中,
shell在find
命令的输出上执行分词。
这样就像你一样使用它是不安全的。
您可以使用while
循环来确保安全:
find . -type f -print0 | while IFS= read -r -d '' f; do
if file "$f" | grep -qe "ELF 64-bit LSB executable" -e "ELF 32-bit MSB executable"; then
chmod -c u=rwx,g=rx,o=rx "$f"
else
chmod -c u=rw,g=r,o=r "$f"
fi
done
(我还简化了条件,以及来自@CharlesDuffy的一堆提示。)