我似乎无法在bash脚本中传递带空格的参数

时间:2017-11-09 20:48:16

标签: linux bash find chmod

我正在尝试编写一个脚本来规范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 Archivechmod视为2个文件(这是非常意外的)。

那导致了什么?我如何解决这个问题(正确传递args)?

奖金问题:有没有更好的方法来实现我尝试使用脚本实现的目标?

1 个答案:

答案 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的一堆提示。)