将wc -c与文件名一起使用时出错

时间:2017-04-01 10:00:43

标签: string bash if-statement string-length wc

我正在运行此代码,用于对所需文件夹中的文件进行排序。如果文件名有13个字符,它应该运行第一个语句,否则运行第二个语句。

for i in *.png; do if [ "$($i | wc -c)" -eq 13 ]; then
    echo cp $i $HOME/Desktop/final/pos_${i:0:1}/${i:0:3}.jpg
else
    echo cp $i $HOME/Desktop/final/pos_${i:0:1}/${i:0:4}.jpg
fi;
done

问题是,[ "$($i | wc -c)" -eq 13 ]始终为0,但很明显,文件名有一定的长度。在if语句中评估wc -c的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

替换

[ "$($i | wc -c)" -eq 13 ]

通过

[ $(printf "%s" "$i" | wc -c) -eq 13 ]

或使用

[ ${#i} -eq 13 ]

答案 1 :(得分:2)

使用bash字符串实用程序获取字符串长度。您根本不需要wc在脚本中双引号所有变量,以避免shell完成分词。

for i in *.png; do 
    if ((${#i} == 13)); then
        echo cp "$i" $HOME/Desktop/final/pos_"${i:0:1}"/"${i:0:3}".jpg
    else
        echo cp "$i" $HOME/Desktop/final/pos_"${i:0:1}"/"${i:0:4}".jpg
    fi
done