如果子shell中给了awk一个空文件列表,则使其退出

如果子shell中给了awk一个空文件列表,则使其退出,awk,find,Awk,Find,我运行: 我什么也没有得到(文件不在那里)。 然后我跑: find mydir -type f -name "the_thing.txt" 我将shell卡在awk中(因为没有指定输入文件,awk现在正在等待stdin) 我的问题是:如果find没有输出任何文件,我如何使awk(或cat)不打印任何内容并退出。您以前的文章中包含了-maxdepth 1选项,该选项将统一文件路径 这就是为什么我要问这个问题。现在这个选项被删除了,我明白了 你所说的某个子目录是什么意思。 那么

我运行:

我什么也没有得到(文件不在那里)。 然后我跑:

find mydir -type f -name "the_thing.txt"
我将shell卡在awk中(因为没有指定输入文件,awk现在正在等待stdin)


我的问题是:如果find没有输出任何文件,我如何使awk(或cat)不打印任何内容并退出。

您以前的文章中包含了
-maxdepth 1
选项,该选项将统一文件路径 这就是为什么我要问这个问题。现在这个选项被删除了,我明白了 你所说的
某个子目录
是什么意思。 那么请你试试:

awk '{print $0}' $(find mydir -type f -name "the_thing.txt")
请注意,如果输入为空,
xargs
-r
选项会抑制执行。
如果要使用
head
命令将文件限制为一个,可以说:

find mydir -type f -name "the_thing.txt" -print0 | xargs -0 -r awk '{print $0}'
coreutils 8.25以来(大约2016年1月),引入了
-z
选项。
如果您的
head
命令不支持该选项,请另外说:

find mydir -type f -name "the_thing.txt" -print0 | head -n1 -z | xargs -0 -r awk '{print $0}'

它对包含空白字符的文件名的鲁棒性较差。

如何:
find mydir-maxdepth 1-type f-name“the_thing.txt”-print0 | xargs-0 awk'{print$0}'
BTW如果文件路径名是确定性的,我们不必使用
find
。我会说:
[-f“mydir/the_thing.txt”]&&awk'{print$0}'“mydir/the_thing.txt”
。我确实需要使用该文件的第一个匹配项,它应该是唯一的,但为了以防万一,我计划在子shell中使用
|head-n1
进行剪切。我怎样才能做到呢?哦,文件可以在某个子目录中。你发布的命令只指示一个特定的唯一路径名。如果您的实际命令不同,请将问题更新为表示
some sunddirectory
。在Linux(或其他GNU
coreutils
平台)上,明显的解决方案是
xargs-r
,但它不是POSIX。@tripleee感谢您的建议。我总是从你的建议中学到很多东西。
find mydir -type f -name "the_thing.txt" | head -n1 | xargs -r awk '{print $0}'