0

CentOS 6.5 と GNU bash バージョン 4.1.2 (OS に組み込まれている)を使用して、ここで見つけた次のスクリプトを使用しています。

#! /bin/bash

FILETYPES=( "*.html" "*.css" "*.js" "*.xml" )
DIRECTORIES="/var/www/html/phpmyadmin"
MIN_SIZE=32

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 gzip -1 -f -c $PLAINFILE > $GZIPPEDFILE; \
                 fi; \
         elif [ `stat --printf=%s $PLAINFILE` -gt $MIN_SIZE ]; \
            then gzip -1 -c $PLAINFILE > $GZIPPEDFILE; \
         fi' \;
  done
done

しかし、それを実行するたびに、次のようになります。

bash: line 5: [: 10262: unary operator expected
bash: line 5: [: 5329: unary operator expected
bash: line 5: [: 264839: unary operator expected
bash: line 5: [: 183256: unary operator expected
bash: line 5: [: 12481: unary operator expected
[...] and lots more :-(

[[5 行目で使用してみましelif [ stat --printf=%s $PLAINFILE -gt $MIN_SIZE ];たが、stdout から奇妙なものが得られます。

4

2 に答える 2

2

あなたの変数$MIN_SIZEはサブシェルに入らないと思います。したがって、そこは空で引用されていないため、シェルは[ 123 -gt ]変数の展開後に次のようなものを見るため、誤解を招くエラーメッセージが表示されます(引用しないことはダークサイドへのステップであり、リードします憎み、苦しむ)。

サブシェルでその定数を設定する必要があります。

-exec bash -c '\
     MIN_SIZE=32; \
     PLAINFILE={};GZIPPEDFILE={}.gz; \
     if [ -e $GZIPPEDFILE ]; \
     then if [ `stat --printf=%Y $PLAINFILE` -gt `stat --printf=%Y $GZIPPEDFILE` ]; \
            then gzip -1 -f -c $PLAINFILE > $GZIPPEDFILE; \
             fi; \
     elif [ `stat --printf=%s $PLAINFILE` -gt $MIN_SIZE ]; \
        then gzip -1 -c $PLAINFILE > $GZIPPEDFILE; \
     fi' \;

そしてもちろん、少なくともまともなエラーメッセージを得るために、あなたのものを適切に引用する必要があります:

-exec bash -c '\
     MIN_SIZE=32; \
     PLAINFILE={};GZIPPEDFILE={}.gz; \
     if [ -e "$GZIPPEDFILE" ]; \
     then if [ "`stat --printf=%Y "$PLAINFILE"`" -gt "`stat --printf=%Y "$GZIPPEDFILE"`" ]; \
            then gzip -1 -f -c "$PLAINFILE" > "$GZIPPEDFILE"; \
             fi; \
     elif [ "`stat --printf=%s "$PLAINFILE"`" -gt "$MIN_SIZE" ]; \
        then gzip -1 -c "$PLAINFILE" > "$GZIPPEDFILE"; \
     fi' \;
于 2014-01-29T11:18:36.950 に答える
0

サブディレクトリ内のすべての一致するファイルを取得するglobstarために を使用する必要がないようにするには、このオプションを使用します。find#! /ビン/バッシュ

FILETYPES=( "*.html" "*.css" "*.js" "*.xml" )
DIRECTORIES="/var/www/html/phpmyadmin"
MIN_SIZE=32

get_mtime () { stat --printf=%Y "$1"; }

for currentdir in "$DIRECTORIES"
do
   for i in "${FILETYPES[@]}"
   do
       for fname in "$currentdir/**/$i"
       do
           if [[ -e $fname.gz ]]; then
               if (( $(stat --printf=%Y "$1" "$fname") >
                     $(stat --printf=%Y "$1" "$fname.gz") )); then
                   gzip -1 -f -c "$fname" > "$fname.gz"
               fi
           elif (( $(stat --printf=%s "$fname") > MIN_SIZE )); then
               gzip -1 -f -c "$fname" > "$fname.gz"
           fi
       done
   done
done
于 2014-01-29T14:55:07.500 に答える