我有一个名为../words的目录,其中包含一些子目录(单词/ blabla,words/blabla),每个子目录又包含两种类型的文件(。 * 1.txt)和(。* 2.txt)。我需要的是对这些文件中的每一个执行AWK脚本。遍历子目录并针对某些文件执行awk脚本
它可能是类似的东西?
for d in words/*
do
for f in .*[0-9].txt
do
awk -f script.awk ${f}
done
done
我有一个名为../words的目录,其中包含一些子目录(单词/ blabla,words/blabla),每个子目录又包含两种类型的文件(。 * 1.txt)和(。* 2.txt)。我需要的是对这些文件中的每一个执行AWK脚本。遍历子目录并针对某些文件执行awk脚本
它可能是类似的东西?
for d in words/*
do
for f in .*[0-9].txt
do
awk -f script.awk ${f}
done
done
如果你想保持你的for
语句结构和应用awk脚本到每个指定文件,你可以做到以下几点:
for file in $(find words -type f -name ".*[12].txt"); do
awk -f script.awk "$file"
done
find
命令对递归查看目录中的任何文件模式很有用。
编辑:如果你的文件名包含的东西,如空格,上面的脚本可能无法正确处理它们,所以你可以做以下代替:
find words -type f -name ".*[12].txt" -print0 | while read -d $'\0' file
do
awk -f script.awk "$file"
done
或使用xargs的:
find words -type f -name ".*[12].txt" -print0 | xargs -0 awk -f script.awk
这使您可以使用空\0
字符分隔文件名,因此名称间距或其他特殊字符ters不会成为问题。 (你可以在这里找到更多的信息:Filenames with spaces breaking for loop, and find command,或在这里:Handling filenames with spaces,或在这里:loop through filenames returned by find)。
不要为'$(whatever)中的文件做',因为各种文件名(如包含空格的文件名)失败。总是做任何|而IFS =读取-r文件'而不是甚至更好'无论| | xargs'。 –
你是对的!我上面做了一个修改,以便按照您的建议提供替代方案。 – assefamaru
@EdMorton:对于某些文件名,这些建议仍然存在问题。 (请注意,文件名甚至可以包含换行符。) – ruakh
鉴于你告诉我们,到目前为止,这应该是所有你需要:
awk -f script.awk ../words/blabla/.*[12].txt
我不知道。如果所有文件都在一次调用中传递,那么'script.awk'可能真诚地表现不同,而如果每个文件都是在单独调用中传递的。 – ruakh
当然,还有其他一些考虑因素,但是OP没有给我们提供什么'script.awk'的功能,也没有提供任何示例输入或预期输出,或者甚至没有提供她的目录结构的具体表示 - 因此“根据你所说的我们到目前为止“ –
如果您需要跳过中间目录平,就看你可以用最大的子目录下/分钟深度
$ find words -maxdepth 2 -mindepth 2 -type f -name '*[0-9].txt' | xargs awk -f ...
是的,管道后没有注意。固定。 – karakfa
那么你试过吗?问题是你没有使用'$ d'。你也可以使用'find'命令。 – cdarke