我想转换一些csv文件的编码与iconv
。它必须是一个脚本,所以我使用的是while; do done
。该脚本列出了特定目录中的每个项目,并将它们转换为另一种编码(utf-8)。
目前,我的脚本列出了每个项目,包括目录...下面是我的问题
iconv
是目录有问题还是忽略了目录?我尝试在每个项目的开头使用How to list only files in Bash? a ***./***
,这有点烦人(我的程序也不喜欢它)。
另一种可能是ls -p | grep -v /
,但这也会影响名称中包含/的文件,不是吗?
我希望你能帮助我。谢谢。
代码如下:
for item in $(ls directory/); do
FileName=$item
iconv -f "windows-1252" -t "UTF-8" FileName -o FileName
done
是的,我知道,输入和输出文件不能是相同的^^
发布于 2018-05-29 19:12:35
基于您引用的现有问题,为什么不删除前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
发布于 2018-05-29 19:18:58
直接使用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
查找工作directory-exec ...
中的所有文件对每个这样的文件执行命令(包括例如filename)bash -c '...'
中的空格或换行符的正确处理执行子way)--
中的'...'
中的命令(更容易执行后续步骤,涉及文件名的多个扩展,该steps终止选项处理,call.{}
命令中的found$1
被文件名替换为第一个(也是唯一一个)参数,即由文件名替换的{}
(请参见bash告诉find
-exec
'ed命令的结束位置。https://stackoverflow.com/questions/50582658
复制相似问题