我生成了一个迭代几个.csv文件的脚本,将相关文件转换为UTF-8:
#!/bin/bash
cd /home/user/prod/
charset="text/plain; charset=iso-8859-1"
for file in *.csv; do
if [[ $(file -i "$file") == "$file: $charset" ]]; then
iconv -f ISO-8859-1 -t UTF-8 "$file" > "$file.new";
mv -f "$file.new" "$file";
fi
done
这很有效,但我真正喜欢的是遍历位于不同路径的文件。我尝试通过设置一个路径(而不是定义当前目录)开始,但我无法使其工作:
#!/bin/bash
path="/home/user/prod"
charset="text/plain; charset=iso-8859-1"
for file in "$path/*.csv"; do
if [[ $(file -i "$file") == "$file: $charset" ]]; then
iconv -f ISO-8859-1 -t UTF-8 "$file" > "$file.new";
mv -f "$file.new" "$file";
fi
done
通过设置路径,最好的方法是什么?处理驻留在不同路径中的文件(相同的扩展名)怎么样?
答案 0 :(得分:2)
当您在
中引用时,可以停止展开globfor file in "$path/*.csv"; do
相反,引用扩展而不是glob:
for file in "$path"/*.csv; do
答案 1 :(得分:2)
你已经接受了@Charles Duffy的答案,但是(如果我理解的话)你的问题是关于在不同的目录中的文件,所以如果你需要在多个目录上使用多个csv文件你可以使用以下代码段:
# array containing the different directories to work with
pathDir=("/foo/bar/dir1" "/buzz/fizz/dir2")
for dir in "${pathDir[@]}" # For each directory
do
for file in "$dir/"*.csv; do # For each csv file of the directory
if [[ $(file -i "$file") == "$file: $charset" ]]; then
iconv -f ISO-8859-1 -t UTF-8 "$file" > "$file.new";
mv -f "$file.new" "$file";
fi
done
done
pathDir
变量是一个包含不同目录路径的数组。
第一个for
循环遍历此数组以获取要检查的所有路径。
上一个答案中的第二个for
循环遍历当前测试目录的文件。