Подскажите как с этим справиться? Такая ситуация: Есть файл(ы), который(е) был(и) создан(ы) в UTF8 среде. Сама кодировка файла мне безразлична, меня интересует только название самого файла. В названии есть буквы которые употребляются только в немецком, нидерландском и тд и тп. И так задача скрипта такова: ищет рекурсивно все pdf файлы в папке, если находит имена файлов, в которых такие самые буквы, заменяет их и одновременно переименовывает файл, чтоб на разных кодировках имя файла было читаемо, ну и дальше выполняет свою работу по пунктам. Для теста был создан файл с названием äÄüÜöÖß.pdf - переименовать нужно в aeAEueUEoeOEsz.pdf. Проблема в следующем: 1.) команда ls *.pdf выдает Code: üÃ?äÃ?öÃ?Ã?.pdf 2.) команда "find ./ -type f -name "*.pdf"": Code: ./üÃäà öÃÃ.pdf (да да, именно в две строки) хотя это один и тот же файл. В первом варианте можно применить другую локалку, но так как я работю и с сед-ом и дополнительными прогами через пайп, то в итоге выводится постоянно второй вариант и при переименовки он выдает ошибку Протокола какого то (mv: failed to access blalblab.pdf: Protocol error). Как решить такую хрень? PS: Code: #!/bin/bash PDF_FILE=$(find /media/sf_scripts/fil/ -type f -name "*.pdf" | sed 's/ /_/g;') for FILE in $PDF_FILE ; do echo mv "$FILE" `echo $FILE | iconv -f utf8 -t iso88591` done наглядный пример, как должно быть: Code: mv /media/sf_scripts/fil/üÃäà öÃÃ.pdf /media/sf_scripts/fil/üÜäÄöÖß.pdf и от сюда уже заменять те самые буквы а как собственно получается: Code: mv: failed to access â/media/sf_scripts/fil/\374\334\344\304\366\326\337.pdfâ: Protocol error
оно? Code: find ./ -name '*.pdf' ./...?...?...?.?.pdf find ./ -name '*.pdf' -exec mv {} qwe.pdf \; ls -lha -rw-r--r-- 1 root root 0 Dec 11 17:48 qwe.pdf
Не, не совсем. Допустим в названии файла "Öl.pdf" букву "Ö" нужно заменить на "Oe", что б получилось "Oel.pdf"
Ладно, включил дебагинг, на одну такую букву выдает такой вот код: буква "Ö" выдает "\303\226", буква "ä" выдает "\303\244". Как теперь sed-ом "\303\226" превратить в "Ое", а "\303\244" в "ae" в одном и том же названии?
Кодировка UTF-8 Code: [taha@LenovoS10 ~]$ touch äÄüÜöÖß.pdf [taha@LenovoS10 ~]$ ls *pdf äÄüÜöÖß.pdf какая кодировка у терминала? зайди в параметры терминала и поменяй кодировку с iso88591 на utf-8 тогда всё будет отображаться норамльно, заменишь символы и всё будет хорошо.. [add] Code: [taha@LenovoS10 ~]$ echo äÄüÜöÖß.pdf | sed 's/ä/ae/g;s/Ä/AE/g;s/ü/ue/g;s/Ü/UE/g;s/ö/oe/g;s/Ö/OE/g;s/ß/sz/g;' | iconv -f utf8 -t iso88591 aeAEueUEoeOEsz.pdf
не так все легко и просто )) там скрипт должен в бэкграунде работать автоматически, который будет запускаться через агент UC4 global (на подобе кронтаба, тока функции больше). В целом безпонятия как там этот агент работает, какой кодировкой он цепляется к другой машине... поэтому сделал таким образом: Code: #!/bin/bash -x export LC_ALL=en_US.utf8 typeset -i n find $(pwd) -type f -name "*.pdf" -print | awk -F "/" '{print $NF}' | while read fn; do replace="$(echo -n "$fn" | tr '[\001-\040]' '[_*]')" if [[ $(echo -n "$replace")="*\303\266*" ]]; then replace=$(echo -n "$replace" | sed -e 's/'$(echo "\o303\o266")'/oe/g') #echo $replace fi if [[ $(echo -n "$replace")="*\303\226*" ]]; then replace=$(echo -n "$replace" | sed -e 's/'$(echo "\o303\o226")'/Oe/g') #echo $replace fi if [[ $(echo -n "$replace")="*\303\244*" ]]; then replace=$(echo -n "$replace" | sed -e 's/'$(echo "\o303\o244")'/ae/g') #echo $replace fi if [[ $(echo -n "$replace")="*\303\204*" ]]; then replace=$(echo -n "$replace" | sed -e 's/'$(echo "\o303\o204")'/Ae/g;') #echo $replace fi if [[ $(echo -n "$replace")="*\303\237*" ]]; then replace=$(echo -n "$replace" | sed -e 's/'$(echo "\o303\o237")'/ss/g;') #echo $replace fi if [[ $(echo -n "$replace")="*\303\234*" ]]; then replace=$(echo -n "$replace" | sed -e 's/'$(echo "\o303\o234")'/Ue/g;') #echo $replace fi if [[ $(echo -n "$replace")="*\303\274*" ]]; then replace=$(echo -n "$replace" | sed -e 's/'$(echo "\o303\o274")'/ue/g;') #echo $replace fi if [[ $(echo -n "$replace")=" " ]]; then replace=$(echo -n "$replace" | sed -e 's/ {1,}/_/g;') #echo $replace fi if [[ $(echo -n "$replace")="*\046*" ]]; then replace=$(echo -n "$replace" | sed -e 's/'$(echo "\o046")'/_und_/g;') #echo $replace fi if [[ $(echo -n "$replace")="*\202\254*" ]]; then replace=$(echo -n "$replace" | sed -e 's/'$(echo "\o202\o254")'/_Euro_/g;') #echo $replace fi if [[ $(echo -n "$replace")="*\342*" ]]; then replace=$(echo -n "$replace" | sed -e 's/'$(echo "\o342")'//g;') #echo $replace fi if [[ $(echo -n "$replace")="*\303\247*" ]]; then replace=$(echo -n "$replace" | sed -e 's/'$(echo "\o303\o247")'/Par./g;') #echo $replace fi if [ "$replace" = "$fn" ]; then continue fi if [ -a "$replace" ]; then n=0 while [ -a "$replace$n" ]; do let n+=1 done replace="$replace$n" fi echo renaming \""$fn\"" to \""$replace\"" echo mv "$fn" "$replace" [COLOR=Green]#тут можно без ехо кому надо )[/COLOR] done