Linux find exec - 输出到不同的目录

Linux find exec - 输出到不同的目录

我正在尝试编写一个简短的脚本来编辑一些 csv 文件。首先,我需要替换分隔符,然后将编码更改为 UTF-16。我想分两步执行此操作,将结果保存在两个不同的文件夹中,以防出现问题。

第一步(替换分隔符)我已经设法像这样解决并且效果相当好:

mkdir ./01_delimiters
find .  -maxdepth 1 -type f -name '*.csv' -exec bash -c 'sed -e "s/|/¦/g" -e "s/╬/|/g" "{}" > ./01_delimiters/"{}"' \;

现在我想从 01_delimiters 文件夹中获取所有文件,更改其编码并将它们保存到文件夹 ./02_encoding 中。我已经尝试了以下几个版本,但它不起作用:

mkdir ./02_encoding
find ./01_delimiters -maxdepth 1 -type f -name '*.csv' -exec bash -c 'iconv -f utf-8 -t utf-16BE "{}" > ./02_encoding/"{}"' \;

它找到的文件没问题,但在输出中抛出“没有这样的文件或目录”错误。有什么想法可以让这项工作发挥作用吗?顺便说一句,我正在使用 Ubuntu。预先非常感谢!

答案1

{}替换为完整路径。这在第一个命令中有效,因为那里的路径只是./file.csv.在第二个命令中,名称为./01_delimiters/file.csv,因此它尝试创建./02_encoding/./01_delimiters/file.csv.

你可以

  • mkdir /02_encoding/./01_delimiters,那么你的输出文件将被放置在该目录中。
  • 在验证第一个操作正常工作后,将这两个操作合并为一个。即使出了问题,你也没有删除原始文件。
  • 将第二条命令更改为

    (cd ./01_delimiters; find . -maxdepth 1 -type f -name '*.csv' -exec bash -c 'iconv -f utf-8 -t utf-16BE "{}" > ../02_encoding/"{}"' \; )
    
  • 只需使用外壳即可

    for file in *.csv; do
      sed -e "s/|/¦/g" -e "s/╬/|/g" "$file" > "./01_delimiters/$file"
      iconv -f utf-8 -t utf-16BE "./01_delimiters/$file" > "./02_encoding/$file"
    done
    

相关内容