2017-02-18 8 views
1

私はLaTeXの本をすべてISO8859-1からUTF-8に変換したいと思っています。変換をエンコードするためのBashスクリプト

私が適応したいスクリプトが見つかりました。だからここに私が書いたものだ:

# start encoding 
encodeFrom='ISO-8859-1' 
# target encoding 
encodeTo='UTF-8' 
# finding files whose extensions correspond to the given parameter 
for filename in ` find . -type f -name *.{$1}` 
do  
    echo $filename 
    # saving source file 
    mv $filename $filename.save 
    # convert file 
    iconv -f $encodeFrom -t $encodeTo $filename.save -o $filename 
    # check that file is in unix mode 
    dos2unix $filename 
done 

問題がある:コマンドが動作しない「検索」:「-v設定」でそれをテストし、私が取得:

find . -type f -name *.{$1} 

私が間違って何をしました?私は自分の道がbashの本を投げつけたのを見つけようとしました(実際には、2つ:-)、解決策を見つけることができませんでした。だけでも、TEXファイル変換にしようとして

for filename in ` find . -type f -name *.tex` 

私が手:

find: les chemins doivent précéder l'expression : arithmetique.tex 
+0

あなたの質問を解決する答えがあるときには、受け入れる答えをクリックしますが、タイトルまたはテキストを '[解決済み]'で更新しないでください – Soren

答えて

0

[OK]を、私は答えを見つけた:ちょうど引数 "守る" のように 'を$ 1。': "。$ 1"なぜあなたはのためのループでfindまたはlsませ解析出力すべき

私がしなければならなかったすべてさようなら\

:-)尋ねた

+0

私の答えが助けになっていますか? – Inian

+0

OK。あなたの答えを正しく受け入れることを忘れて申し訳ありません:-( –

+0

二重引用符が必要ですが、スクリプト内の問題を解決するには十分ではありません – Soren

2

は、ParsingLsを参照してください。

whileループ、常にダブルクォートあなたの変数との適切なプロセス置換構文を使用します。あなたのファイル名が改行文字、空白やその他の特殊文字を持っている場合

while IFS= read -r filename 
do 
    echo "$filename" 
    mv "$filename" "${filename}".save 
    iconv -f "$encodeFrom" -t "$encodeTo" "${filename}".save -o "$filename" 
    dos2unix "$filename" 
done < <(find . -type f -name "*.{$1}") 

以下の通りでfind

while IFS= read -r -d'' filename 
do 
    echo "$filename" 
    mv "$filename" "${filename}".save 
    iconv -f "$encodeFrom" -t "$encodeTo" "${filename}".save -o "$filename" 
    dos2unix "$filename" 
done < <(find . -type f -name "*.{$1}" -print0) 
でそれを使用して

-print0 
     True; print the full file name on the standard output, followed by a null character 
     (instead of the newline character that -print uses). This allows file names 
     that contain newlines or other types of white space to be correctly interpreted by 
     programs that process the find output. 

、場合find-print0オプションを使用することをお勧めします

これを使用すると、ファイル名の間に\0が追加され、読み取りによってファイル名wiあなたのfindの結果が完全であることを保証します。

+0

啓蒙のおかげで、@inian :-) –

+0

@NicolasFRANCOIS:私は誰かが私の質問に答えるとする](http://stackoverflow.com/help/someone-answers)? – Inian

+0

これは、 'ls'を解析するのと同じ問題を抱えています:ファイル名に改行が含まれています。 – chepner

関連する問題