从文件名中删除正则表达式,同时对它们进行管道传输

从文件名中删除正则表达式,同时对它们进行管道传输

我正在将 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 {} +

相关内容