Предполагая, что у меня есть файл с именем list.txt содержит пути к файлам внутри каталога;

И шаблон путей, как это:

./path/to/file.txt
./path/to/another/file.txt
... etc

Я хочу сделать цикл внутри файла list.txt чтобы получить пути к файлам и изменить его кодировку с помощью iconv ;

Я делал это, если все было в одном каталоге, используя:

for i in `cat list.txt` ; do iconv -f windows-1256 -t utf8 $i > new_$i; done

Но проблема, с которой я сейчас сталкиваюсь, заключается в том, что, поскольку это многоуровневые пути, при присвоении имени выводу iconv new_$i в начале пути - я думаю - и это дает мне ошибки:

No such file or directory

Итак, как я могу получить выход iconv как:

./path/to/new_file.txt
./path/to/another/new_file.txt
... etc

1 ответ1

1

Вы можете использовать что-то вроде этого, если вы используете bash качестве оболочки:

while read name
do dir="${name%/*}" file="${name##*/}"
iconv -f windows-1256 -t utf8 "$dir/$file" -o "$dir/new_$file"
done  < list.txt

Строка, которая назначает dir и file использует конструкции, документированные в части Parameter expansion в разделе EXPANSION страницы руководства bash . Кавычки вокруг конструкций предназначены для обработки пробелов в именах файлов.

Если вы хотите проверить что-то подобное перед использованием, вы можете добавить echo к интересующей вас команде (iconv в этом примере), чтобы убедиться, что эта команда именно такая, как вы и предполагали.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .