Ошибка при использовании wc -c с именами файлов

Я запускаю этот код, который сортирует файлы в нужных папках. Если имя файла имеет 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, но ясно, что имена файлов имеют некоторую длину. Как правильно оценивать wc -c в операторе if?

2 ответа

Решение

Замещать

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

от

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

или использовать

[ ${#i} -eq 13 ]

Использование bash строковые утилиты, чтобы получить длину строки. Вам не нужно wc совсем. И заключите в кавычки все переменные в скрипте, чтобы избежать разбиения слов, выполняемого оболочкой.

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
Другие вопросы по тегам