用于编码转换的Bash脚本

时间:2017-02-18 15:24:05

标签: bash

我希望将我在LaTeX上的所有作品从ISO8859-1转换为UTF-8。

我找到了一个我想要改编的脚本。所以这就是我写的:

# 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书(事实上,两个:-),但无法找到解决方案。

甚至只尝试tex文件转换:

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

我明白了:

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

2 个答案:

答案 0 :(得分:2)

  

请参阅ParsingLs,为什么 NOT 解析for循环中findls的输出。

使用正确的进程替换语法和while循环, ALWAYS 双引号变量。

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}")

如下所示,如果您的文件名包含换行符号,空格或任何其他特殊字符,则建议在-print0中使用find选项

-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

中使用它
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)

使用它会在文件名之间追加\0,并使用相同的字符读取文件名,确保您的find结果完好无损。

答案 1 :(得分:0)

好的,我找到了答案:只是&#34;保护&#34;论证&#39; 。$ 1&#39;像这样:&#34; 。$ 1&#34;。

我所要做的只是问: - )

\再见