【问题标题】:Only list files; iconv and directories?仅列出文件; iconv 和目录?
【发布时间】:2018-05-29 10:57:14
【问题描述】:

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

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

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

  2. 如果出现问题,我该如何仅列出/仅搜索文件?

我在每个项目的开头都尝试了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

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

【问题讨论】:

  • 首先,不要解析ls 的输出。 第二……你的标题怎么会提到你的问题中完全没有的好方法? (链接不算数...)
  • 另外,据我所知,iconv 没有选项-o...
  • 对不起,你是对的。我确实有 find 的问题。 -maxdepth 1 -type f ,但这不是主要的。我编辑了标题。
  • Related answer 展示了您可以使用 find ... -exec 做什么。这应该始终是首选路线,因为它不会拒绝空格或文件名中的换行等其他有趣的东西。
  • "另外,据我所见,iconv 没有选项“好吧,但是我将它与这个选项一起使用,它可以完美地工作并且符合预期。唯一的问题是我必须为这个命令提供一个 csv 文件列表......

标签: linux shell csv ls iconv


【解决方案1】:

直接使用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 命令在哪里结束。

【讨论】:

  • 感谢您的努力
【解决方案2】:

在您引用的现有问题的基础上,您为什么不只删除前 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

【讨论】:

  • @DevSolar,你能举一个文件名中断的例子吗?
  • 嗯嗯,是的,这将是一种可能性,我想,我会那样做。我只是不喜欢在特定数量的字符之后硬编码剪辑……这似乎很容易出错。谢谢你:)
  • 取决于他将该命令的结果提供给什么。文件名为“foo bar.txt”的for file in $(find . -maxdepth 1 -type f | cut -c 3-); do echo $file; done 在您尝试对这些“文件”进行任何操作时会给出一个“foo”、一个“bar.txt”和两个“找不到文件”。 ;-)
  • @Telvanis:如果你想要只是文件名,请注意我对使用-printf "%f" 的评论。一般来说,man find。该工具可以为您做的事情比您想象的要多得多,并且几乎击败了所有其他迭代一组文件的尝试。
猜你喜欢
  • 2011-06-29
  • 2011-09-04
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多