文件名带有空格的 Shell 脚本错误

文件名带有空格的 Shell 脚本错误

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

相关内容