Ssh

帶有空格的文件名上的 Shell 腳本錯誤

  • July 31, 2013

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

引用帶有文件名的變數,這樣它們就不會被解釋為命令的多個參數:

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

引用自:https://serverfault.com/questions/527798