2009-07-25 43 views
16

Tôi biết tôi có thể chuyển đổi một mã hóa tập tin duy nhất dưới OSX sử dụng:OSX mã hóa thay đổi tập tin (iconv) đệ quy

iconv -f ISO-8859-1 -t UTF-8 myfilename.xxx > myfilename-utf8.xxx

tôi phải chuyển đổi một loạt các file có phần mở rộng cụ thể, vì vậy tôi muốn để chuyển đổi mã hóa tập tin từ ISO-8859-1 sang UTF-8 cho tất cả các tập tin * .ext trong thư mục/mydisk/Myfolder

lẽ someobe biết cú pháp như thế nào để làm điều này

nhờ

Ekke

Trả lời

23

Adam' bình luận chỉ cho tôi cách làm thế nào để giải quyết nó, nhưng đây là cú pháp duy nhất mà tôi đã làm cho nó làm việc:

find /mydisk/myfolder -name \*.xxx -type f | \ 
    (while read file; do 
     iconv -f ISO-8859-1 -t UTF-8 "$file" > "${file%.xxx}-utf8.xxx"; 
    done); 

-i ... -o ... doesnt làm việc, nhưng>

thx lần nữa

Ekke

+1

Để ghi đè lên các tệp được tạo thành '#!/Bin/bash tìm ./tmp -type f | \ (trong khi đọc tệp; làm biểu tượngv -f windows-1251 -t UTF-8 "$ tệp" -o "$ tệp"; xong); ' – temni

+2

Cảm ơn. Tôi đã không giúp tôi rất nhiều. Tôi đã làm như vậy '#!/Bin/bash tìm ./src -type f | \ (trong khi tập đọc; làm \t nếu [[ "$ file" = * .DS_Store *]!], Sau đó \t \t nếu [[ "$ file" = * -utf8 *]!], Sau đó \t \t \t iconv -f CP1251 -t UTF-8 "$ file"> "$ file-utf8"; \t \t \t rm $ file; \t \t \t mv "$ file-utf8" "$ tập tin"; \t \t fi \t fi hoàn thành); ' –

0

Bạn có thể viết một kịch bản trong bất kỳ ngôn ngữ kịch bản để lặp qua mỗi tập tin trong/mydisk/Myfolder, kiểm tra phần mở rộng với regex [. (. *) $], Và nếu đó là "ext" , chạy lệnh sau (hoặc tương đương) từ một cuộc gọi hệ thống.

"iconv -f ISO-8859-1 -t UTF-8" + file.getName() + ">" + file.getName() + "-utf8.xxx"

này sẽ chỉ là một vài dòng trong Python, nhưng tôi để nó như một bài tập để người đọc đi qua các chi tiết cụ thể của việc tìm kiếm lặp lại thư mục và các biểu thức thông thường.

3

nếu shell của bạn là bash, một cái gì đó như thế này

for files in /mydisk/myfolder/*.xxx 
do 
    iconv -f ISO-8859-1 -t UTF-8 "$files" "${files%.xxx}-utf8.xxx" 
done 
0

Nếu bạn muốn làm điều đó một cách đệ quy, bạn có thể sử dụng find(1):

find /mydisk/myfolder -name \*.xxx -type f | \ 
    (while read file; do 
     iconv -f ISO-8859-1 -t UTF-8 -i "$file" -o "${file%.xxx}-utf8.xxx 
    done) 

Lưu ý rằng tôi đã sử dụng | while read thay vì -exec tùy chọn tìm (hoặc đường ống vào xargs) vì các thao tác chúng tôi cần thực hiện với tên tệp, cụ thể là, cắt phần mở rộng .xxx (sử dụng ${file%.xxx}) và thêm -utf8.xxx.

+0

Xem câu trả lời từ ekkescorner để biết giải pháp làm việc – Kutzi

1

thử này ... Nó rất được thử nghiệm và workin:

Bước đầu tiên (ICONV): tìm/var/www/-name * .php -type f | (trong khi đọc tập tin, làm iconv -f ISO-8859-2 -t UTF-8 "$ file"> "$ {file% .php} .phpnew"; done)

Bước thứ hai (REWRITE - MV): tìm/var/www/-name "* .phpnew" -type f | (Trong khi đọc tập tin; làm mv $ file echo $file | sed 's/\(.*\.\)phpnew/\1php/'; thực hiện)

Nó chỉ kết luận về nghiên cứu của tôi :)

Hy vọng nó giúp Jakub Rulec

2

Dưới đây là ví dụ Tested trong mac 10.10. Tìm tệp theo tên, chuyển đổi mã hóa, sau đó thay thế tệp gốc hoàn hảo. Cảm ơn ví dụ của Roman Truba, COPY toàn bộ mã bên dưới vào kịch bản lệnh shell của bạn.

#!/bin/bash 
     find ./ -name *.java -type f | \ 
     (while read file; 
      do if [[ "$file" != *.DS_Store* ]]; then 
      if [[ "$file" != *-utf8* ]]; then 
       iconv -f ISO-8859-1 -t UTF-8 "$file" > "$file-utf8"; 
       rm $file; 
       echo mv "$file-utf8" "$file"; 
       mv "$file-utf8" "$file"; 
      fi 
     fi 
     done); 
+0

Tôi phải thay đổi thành: find ./ -name" * .java "-type f Nếu không, nó sẽ không wortk đệ quy – carlosvini

0

tôi mở rộng Albert.Qings kịch bản:

  • autodetect mã hóa tập tin hiện
  • thêm một tham số lệnh để làm một khô/exec-chạy
  • thêm một tham số cho thư mục và tên tệp mẫu

    #!/bin/bash 
    command=${1-"usage"} 
    searchPattern=${2-"*.java"} 
    searchDirectory=${3-"."} 
    if [[ "$command" == "usage" ]]; then 
        echo "convert-file-to-utf8.sh [usage|dry|exec] [searchPattern=$searchPattern] [searchDirectory=$searchDirectory]" 
        exit 
    fi 
    find $searchDirectory -type f -name "$searchPattern" | \ 
    (while read file; 
        do if [[ "$file" != *.DS_Store* ]]; then 
        if [[ "$file" != *-utf8* ]]; then 
         currentEncoding="$(file --brief --mime-encoding $file)" 
         if [[ "$currentEncoding" != "utf-8" ]]; then 
          echo "command:$command/iconv -f $currentEncoding -t UTF-8 $file" 
          if [[ "$command" == "exec" ]]; then 
          iconv -f $currentEncoding -t UTF-8 "$file" > "$file-utf8"; 
          rm $file; 
          echo mv "$file-utf8" "$file"; 
          mv "$file-utf8" "$file"; 
          fi 
         fi 
        fi 
    fi 
    done); 
    

Thử nghiệm trên MacOS X 10.12.6/Sierra.

Các vấn đề liên quan