Ошибка при использовании 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