![文件名带有空格的 Shell 脚本错误](https://linux22.com/image/615691/%E6%96%87%E4%BB%B6%E5%90%8D%E5%B8%A6%E6%9C%89%E7%A9%BA%E6%A0%BC%E7%9A%84%20Shell%20%E8%84%9A%E6%9C%AC%E9%94%99%E8%AF%AF.png)
我有一个 bash 脚本,用于搜索位于我的服务器根目录下的每个静态文件,并在每个文件旁边存储一个 gzip 版本。我从http://wiki.linuxwall.info/doku.php/en:ressources:dossiers:nginx:nginx_performance_tuning
问题是它不适用于带空格的文件名,我的网站现在不使用任何空格,我会尝试它永远不会,但我不是唯一一个在前端工作的人,所以我可能无法始终控制它,所以我只是想确保这个脚本也适用于带空格的文件。希望有人能看看并帮我修复它。
#! /bin/bash
FILETYPES=("*.html" "*.woff" "*.css" "*.jpg" "*.jpeg" "*.gif" "*.png" "*.js")
# specify a list of directories to check recursively
DIRECTORIES="/usr/share/nginx/www/"
for currentdir in $DIRECTORIES
do
for i in "${FILETYPES[@]}"
do
find $currentdir -iname "$i" -exec bash -c 'PLAINFILE="{}";GZIPPEDFILE="{}".gz; \
if [ -e "$GZIPPEDFILE" ]; \
then if [ `stat --printf=%Y $PLAINFILE` -gt `stat --printf=%Y $GZIPPEDFILE` ]; \
then echo "$GZIPPEDFILE outdated, regenerating"; \
gzip -9 -f -c $PLAINFILE > $GZIPPEDFILE; \
fi; \
else echo "$GZIPPEDFILE is missing, creating it"; \
gzip -9 -c $PLAINFILE > $GZIPPEDFILE; \
fi' \;
done
done
答案1
用文件名引用变量,这样它们就不会被解释为命令的多个参数:
#! /bin/bash
FILETYPES=("*.html" "*.woff" "*.css" "*.jpg" "*.jpeg" "*.gif" "*.png" "*.js")
# specify a list of directories to check recursively
DIRECTORIES="/usr/share/nginx/www/"
for currentdir in $DIRECTORIES
do
for i in "${FILETYPES[@]}"
do
find "$currentdir" -iname "$i" -exec bash -c 'PLAINFILE="{}";GZIPPEDFILE="{}".gz; \
if [ -e "$GZIPPEDFILE" ]; \
then if [ `stat --printf=%Y "$PLAINFILE"` -gt `stat --printf=%Y "$GZIPPEDFILE"` ]; \
then echo "$GZIPPEDFILE outdated, regenerating"; \
gzip -9 -f -c "$PLAINFILE" > "$GZIPPEDFILE"; \
fi; \
else echo "$GZIPPEDFILE is missing, creating it"; \
gzip -9 -c "$PLAINFILE" > "$GZIPPEDFILE"; \
fi' \;
done
done