如何只显示Find语句的第三个匹配项?

如何只显示Find语句的第三个匹配项?

我见过的答案都不适合我,我有这样的代码

OLDVER=`readlink current`
OLDDATA=`find ! -newer $OLDVER

我只想从 FIND 语句中获得第三个匹配项,因为我的脚本需要这个名称文件。

答案1

如果您知道文件名不包含任何换行符,则以下命令将起作用:

find使用head和提取第三个结果tail

find <PATH> <EXPRESSION> | head -n 3 | tail -n 1

find提取使用的第三个结果sed

find <PATH> <EXPRESSION> | sed '3q;d'

find提取使用的第三个结果awk

find <PATH> <EXPRESSION> | awk 'NR==3{print;exit}'

使用帖子中的命令可能会如下所示:

find ! -newer "$(readlink current)" | sed '3q;d'

如果您想处理名称可能包含换行符的文件,那么您可以使用该-print0选项并循环结果,例如如下所示:

find . -print0 | (\
    IFS=$'\0' \
    n=0; \
    while read -r -d '' line; do \
        ((n++)); if [[ $n -eq 3 ]]; then \
        echo "${line}"; \
        break; \
    fi; \
done)

要检查这是否有效,您可以执行类似以下实验的操作:

mkdir /tmp/test

cd /tmp/test

touch $'file1 line1\012file1 line2'

touch $'file2 line1\012file2 line2'

touch $'file3 line1\012file3 line2'

find . -print0 | (\
    n=0; \
    while read -r -d '' line; do \
        ((n++)); if [[ $n -eq 3 ]]; then \
        echo "${line}"; \
        break; \
    fi; \
done)

这会产生以下输出(如预期):

./file3 line1
file3 line2

相关内容