只列出文件; iconv和目录?

时间:2018-05-29 10:57:15

标签: linux shell csv ls iconv

我想用iconv转换一些csv文件的编码。它必须是一个脚本,所以我正在使用while; do done。该脚本列出了特定目录中的每个项目,并将它们转换为另一个编码(utf-8)。

目前,我的脚本列出了每个项目,包括目录......所以这是我的问题

  1. iconv是否存在目录问题或忽略它们?

  2. 如果出现问题,我怎样才能仅列出/搜索文件?

  3. 我在每个项目的开头尝试How to list only files in Bash?一个***./***,这有点烦人(我的程序也不喜欢它)。

    另一种可能性是ls -p | grep -v /,但这也会影响名称中包含 / 的文件,不是吗?

    我希望你能帮助我。谢谢。

    以下是代码:

    for item in $(ls directory/); do
       FileName=$item
       iconv -f "windows-1252" -t "UTF-8" FileName -o FileName
    done
    

    是的,我知道,输入和输出文件不能相同^^

2 个答案:

答案 0 :(得分:0)

根据您引用的现有问题,为什么不删除前2个字符,即./

  find . -maxdepth 1 -type f | cut -c 3-

编辑:我同意@DevSolar关于for循环中基于空间的问题。虽然我认为他的解决方案对于这个问题更好,但我只是想提供一种替代方法来摆脱基于空间的for循环问题。

   OLD_IFS=$IFS
   IFS=$'\n'
   for item in $(find . -maxdepth 1 -type f | cut -c 3-); do
   FileName=$item
   iconv -f "windows-1252" -t "UTF-8" FileName -o FileName
   done
   IFS=$OLD_IFS

答案 1 :(得分:0)

直接使用find

find . -maxdepth 1 -type f -exec bash -c 'iconv -f "windows-1252" -t "UTF-8" $1 > $1.converted && mv $1.converted $1' -- {} \;
  • find . -maxdepth 1 -type f查找工作目录中的所有文件
  • -exec ...对每个此类文件执行命令(包括正确处理文件名中的空格或换行符)
  • bash -c '...'在子shell中执行'...'中的命令(更容易执行后续步骤,涉及文件名的多次扩展,这样)
  • --终止选项处理,并将--之后的任何内容视为该调用的参数。
  • {}find替换为找到的文件名
  • bash命令中的
  • $1被替换为第一个(也是唯一的)参数,即{}替换为文件名(见上文)
  • \;告诉find -exec'ed命令的结束位置。