使用 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
的情况下做到这一点。
我正在尝试解析我指定目录下所有子目录(和子子目录)中名为 "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
的情况下做到这一点。