Назад | Перейти на главную страницу

Ошибка сценария оболочки для имени файла с пробелами

У меня есть сценарий bash, который ищет каждый статический файл, расположенный в корне моего сервера, и хранит сжатую версию рядом с каждым файлом. Я получил это от 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

Цитируйте переменные с именами файлов в них, чтобы они не интерпретировались как несколько аргументов команды:

#! /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