bash中if语句的表达式中的语法错误

时间:2012-11-20 07:36:22

标签: linux bash shell if-statement

代码如下,我想检查一些文件大小小于410Bytes的文件:

for file in *; do
    if [[ "$file" =~ ^dataset([0-9]+)$ && `du -b $file/${BASH_REMATCH[1]}_conserv.png` -lt 410 ]]; then
    cd $file
    $some_commands
    cd ..
    fi
done

然而,当我运行这个脚本时,它抱怨如下:

less_than_410.bash: line 2: [[: 13605   dataset4866/4866_conserv.png: syntax error in expression (error token is "dataset4866/4866_conserv.png")

有没有人有关于如何解决这个问题的想法?谢谢!

3 个答案:

答案 0 :(得分:3)

du -b file

它将打印文件大小和名称。使用cut仅获取尺寸:

du -b file | cut -f 1

答案 1 :(得分:0)

不要使用这样复杂的表达式,而是执行:

find . -maxdepth 1 -regex '.*/dataset[0-9]+' -size -410c

(请注意,-maxdepth和-regex都是要查找的gnu扩展名。由于您的问题标记为linux,因此可能会提供这些选项。)

答案 2 :(得分:0)

使用bash extended globbing来限制文件循环:

shopt -s extglob
for file in dataset+([0-9]); do
    num=${file#dataset}
    (( $(stat -c %s "$file/${num}_conserv.png") >= 410 )) && continue
    do stuff here
done