循环遍历多个文件夹并执行命令,然后写入文件

循环遍历多个文件夹并执行命令,然后写入文件

我想在执行以下命令时循环遍历 10 个文件夹:

awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 > ${f}_appended.dat

使用 for 循环包装器,如下所示:

for f in */ ; do awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 > ${f}_appended.dat; done

它只_appended.dat在每个文件夹中写入,不会对它循环遍历的文件夹中的文件执行命令,而是对根文件夹(如果有)执行命令。

期望的结果:

在使用 awk 命令生成的每个文件夹中都有一个 _appished.dat 文件。因此,有 10 个文件夹,每个文件夹中都有一个基于 .csv 文件内容生成的唯一文件。

答案1

这将对每个子目录中awk的文件运行该命令*.csv,并在该目录中留下一个{dirname}_appended.dat包含输出的文件:

for f in */
do
    awk 'FNR > 1' "$f"/*.csv | sort -sk 1,2 | sort -sk 3,3 >"${f}${f%/}_appended.dat"
done

讨论

考虑:

for f in */ ; do awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 > ${f}_appended.dat; done

每次运行循环时,都会处理*.csv当前目录中的文件。要获取目录中的文件$f,请使用"$f"/*.csv代替*.csv.

另外,上面将每次运行的结果放入文件中${f}_appended.dat

选择

另一种方法是cd进入每个目录并运行awk命令:

for f in */
do
    ( cd "$f"; awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 >"${f%/}_appended.dat" )
done

cd命令在子 shell 内运行(由括号分隔)。因此,一旦子 shell 退出,当前目录就会恢复为其原始值。

相关内容