我正在将 bash 文件从iso-latin-1
(又名iso-8859-1
)转换为utf-8
.在这个过程中,我有机会重命名文件。并且,我想借此机会更改文件中容易出错的书写名称格式。
这些文件的名称如下:
tree Dados/Jan/
Dados/Jan/
├── 201301_Licitacoes
│ ├── 201301_EmpenhosRelacionados.csv
│ ├── 201301_ItemLicitaЗ╞o.csv
│ ├── 201301_LicitaЗ╞o.csv
│ └── 201301_ParticipantesLicitaЗ╞o.csv
├── 201401_Licitacoes
│ ├── 201401_EmpenhosRelacionados.csv
│ ├── 201401_ItemLicitaЗ╞o.csv
│ ├── 201401_LicitaЗ╞o.csv
│ └── 201401_ParticipantesLicitaЗ╞o.csv
├── 201501_Licitacoes
│ ├── 201501_EmpenhosRelacionados.csv
│ ├── 201501_ItemLicitaЗ╞o.csv
│ ├── 201501_LicitaЗ╞o.csv
│ └── 201501_ParticipantesLicitaЗ╞o.csv
├── 201601_Licitacoes
│ ├── 201601_EmpenhosRelacionados.csv
│ ├── 201601_ItemLicitaЗ╞o.csv
│ ├── 201601_LicitaЗ╞o.csv
│ └── 201601_ParticipantesLicitaЗ╞o.csv
(...)
我正在执行以下操作:
find Dados/Jan/ -maxdepth 2 -name '*.csv' -exec sh -c 'conv {}' \;
其中,conv
是以下脚本:
#!/usr/bin/env bash
## adapted from https://stackoverflow.com/questions/62918711/convert-multiple-csv-files-to-utf-8-encoding-using-a-script-windows-command-prom
for file in $@; do
iconv -f ISO-8859-1 UTF-8 <"$file" >"$file".tmp &&
mv "$file.tmp" "$file"
done
在这个过程中,我想删除“З╞o“ 文件名中的文本,当我解压缩文件时(可能有人使用过”〜“文件名称等)。
答案1
mv
将文件传输到最终目的地时使用 shell“参数扩展” 。喜欢
mv "$file.tmp" "${file//З╞o}"
它总是相同的字符序列吗?
答案2
使用 的bash
“模式替换”(读man bash
)并执行以下操作:
echo mv "$file.tmp" "${file/3|-o//}"
echo
如果您喜欢结果,请删除。切勿使用实际mv
命令进行测试,否则可能会导致数据丢失。
答案3
最有可能的LicitaЗ╞o
意思是Licitação
,这是葡萄牙语的“Liitation”。
您可以使用以下方法进行硬转换${var//icitaЗ╞o/icitação}
:
for file in "$@"; do
filedest="${file//icitaЗ╞o/icitação}"
iconv -f ISO-8859-1 UTF-8 <"$file" >"$file".tmp &&
mv "$file.tmp" "$filedest"
[[ $file != $filedest ]] && rm "$file"
done
答案4
将转换后的文件写入所需的目标文件名,然后删除原始文件
for file in "$@"
do
iconv -f ISO-8859-1 -t UTF-8 <"$file" >"${file/З╞o/}" &&
rm -f -- "$file"
done
还要注意"$@"
现在是双引号的。这是必需的,这样它就不会(错误地)像$*
.
最后,find
可以简化,因为该脚本可以接受多个参数:
find Dados/Jan/ -maxdepth 2 -name '*.csv' -exec conv {} +