Я запускаю этот код, который сортирует файлы в нужных папках. Если имя файла имеет 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
sanjihan 1 Апр 2017 в 13:00

2 ответа

Лучший ответ

Замещать

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

По

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

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

[ ${#i} -eq 13 ]
2
Cyrus 1 Апр 2017 в 10:07

Используйте 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
2
Inian 28 Дек 2017 в 10:10