我想用iconv
转换一些csv文件的编码。它必须是一个脚本,所以我正在使用while; do done
。该脚本列出了特定目录中的每个项目,并将它们转换为另一个编码(utf-8)。
目前,我的脚本列出了每个项目,包括目录......所以这是我的问题
iconv
是否存在目录问题或忽略它们?
如果出现问题,我怎样才能仅列出/搜索文件?
我在每个项目的开头尝试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
是的,我知道,输入和输出文件不能相同^^
答案 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
替换为找到的文件名$1
被替换为第一个(也是唯一的)参数,即{}
替换为文件名(见上文)\;
告诉find
-exec
'ed命令的结束位置。