使用带文件名的 wc -c 时出错

error when using wc -c with file names

我正在 运行ning 这段代码,它将文件排序到所需的文件夹中。如果一个文件名有 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 的正确方法是什么?

替换

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

来自

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

或使用

[ ${#i} -eq 13 ]

使用 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