Bash:处理目录中的所有文件

时间:2020-04-29 17:32:57

标签: linux bash

我将如何对目录中的所有文件应用逻辑并将每个输入文件的最终输出通过管道传输到单独的文件? 像下面这样

cut -d, -f2 input1.csv | awk 'END{print NR}' > input1_count.csv

(实际命令很长,但是为了简化起见,我在上面使用了它,以便更好地理解目录中所有文件的逻辑)

2 个答案:

答案 0 :(得分:2)

您可以在文件名上使用for循环:

shopt -s nullglob # enable nullglob
for f in *.csv; do
   cut -d, -f2 "$f" | awk 'END{print NR}' > "${f%.csv}_count.csv"
done
shopt -u nullglob # disable nullglob

全局模式*.csv扩展为启用了nullglob的空字符串(而不是文字且可能不存在的文件名*.csv)。 在循环中,将命令管道应用于每个文件名,然后将输出重定向到新文件名。

parameter expansion ${f%.csv} 从文件名中删除最短的后缀模式.csv

答案 1 :(得分:1)

一个简单的for循环就可以完成工作:

for f in *.csv; do
   cut -d, -f2 "$f" | awk 'END{print NR}' > "${f/%.csv/_count.csv}"
done

这假定当前目录中存在.csv个文件。如果文件可能不存在,请在shopt循环上方使用以下任何for

shopt -s failglob    # return error when glob matching fails

shopt -s nullglob    # be silent when glob matching fails