Кодировка названия файла

Discussion in 'Linux, Freebsd, *nix' started by Tw!m4, 11 Dec 2013.

  1. Tw!m4

    Tw!m4 Elder - Старейшина

    Joined:
    15 Jun 2007
    Messages:
    187
    Likes Received:
    19
    Reputations:
    0
    Подскажите как с этим справиться?

    Такая ситуация:

    Есть файл(ы), который(е) был(и) создан(ы) в 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
     
  2. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    оно?
    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
     
  3. Tw!m4

    Tw!m4 Elder - Старейшина

    Joined:
    15 Jun 2007
    Messages:
    187
    Likes Received:
    19
    Reputations:
    0
    Не, не совсем. Допустим в названии файла "Öl.pdf" букву "Ö" нужно заменить на "Oe", что б получилось "Oel.pdf"
     
  4. Tw!m4

    Tw!m4 Elder - Старейшина

    Joined:
    15 Jun 2007
    Messages:
    187
    Likes Received:
    19
    Reputations:
    0
    Ладно, включил дебагинг, на одну такую букву выдает такой вот код:

    буква "Ö" выдает "\303\226", буква "ä" выдает "\303\244". Как теперь sed-ом "\303\226" превратить в "Ое", а "\303\244" в "ae" в одном и том же названии?
     
  5. taha

    taha Elder - Старейшина

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    Кодировка 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
    
     
    #5 taha, 12 Dec 2013
    Last edited: 12 Dec 2013
  6. Tw!m4

    Tw!m4 Elder - Старейшина

    Joined:
    15 Jun 2007
    Messages:
    187
    Likes Received:
    19
    Reputations:
    0
    не так все легко и просто )) там скрипт должен в бэкграунде работать автоматически, который будет запускаться через агент 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