我有一个 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