使用 awk 读取和创建所有子目录中的文件

Using awk to read and create files in all subdirectories

我正在尝试解析我指定目录下所有子目录(和子子目录)中名为 "README" 的所有文件,并在每个 "README" 找到文件。

#!/bin/bash

FILES=$(find myDirectory -type f -name 'README')
for f in $FILES
do
   #this is fine
   echo "parsing $f"

   #this is not fine
   awk -F, 'BEGIN {print "header"};
   {print ;}
   END {print "footer";}' $f > outputfile

done

输出文件仅在我的工作目录中创建。我想要做的是将输出文件重定向到找到相应自述文件的子目录中。还有比这更好的方法吗?

如果有帮助,README 格式:

something,something2,something3
nothing1,nothing2,nothing3

鉴于您希望在找到 README 的目录中创建输出文件,最简单的方法是使用 POSIX 标准 dirname 命令:

#!/bin/bash

FILES=$(find myDirectory -type f -name 'README')
for f in $FILES
do
    outputfile="$(dirname "$f")/outputfile"
    echo "parsing $f into $outputfile"

    awk -F, 'BEGIN {print "header"}
             {print }
             END {print "footer"}' "$f" > "$outputfile"

done

如果目录中有空格或换行符,则此代码不安全,但假设您坚持使用可移植文件名字符集(字母、数字、点、破折号和下划线),就不会有大问题. (在我进行任何更改之前它是不安全的;它仍然不安全。它不安全是因为你使用了 FILES=$(find …) 并且当你这样做时,它几乎可以保证对于带有空格的名称保持不安全、制表符、换行符。有办法解决这个问题,但它们涉及更多的大手术。)

如果你愿意,你可以研究Bashparameter expansion机制,看看如何在不使用dirname的情况下做到这一点。