我正在使用以下脚本,我发现here使用CentOS 6.5和GNU bash版本4.1.2(内置于操作系统)。
#! /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得到了奇怪的东西。
答案 0 :(得分:2)
我认为你的变量$MIN_SIZE
没有进入子shell,因此它在那里是空的而没有引用,因此你得到那个误导性的错误信息,因为shell在变量之后看到[ 123 -gt ]
之类的东西扩张(不是引用是黑暗面的一步,导致仇恨和痛苦)。
您应该在子shell中设置该常量:
-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' \;
答案 1 :(得分: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