通过bash脚本与多个目录中的文件交互

时间:2015-05-26 21:35:32

标签: linux bash shell

我生成了一个迭代几个.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

通过设置路径,最好的方法是什么?处理驻留在不同路径中的文件(相同的扩展名)怎么样?

2 个答案:

答案 0 :(得分:2)

当您在

中引用时,可以停止展开glob
for 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循环遍历当前测试目录的文件。