Como exibir apenas a terceira correspondência da instrução Find? [duplicado]

2

Nenhuma das respostas que vi funciona para mim, tenho código como este

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

E eu quero obter apenas o terceiro jogo da instrução FIND, porque eu preciso desse arquivo de nome para o meu script.

    
por harcotlupus 08.11.2017 / 22:55

1 resposta

1

Se você sabe que os nomes dos seus arquivos não contêm caracteres de nova linha, os seguintes comandos funcionarão:

Extraia o terceiro resultado de find usando head e tail :

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

Extraia o terceiro resultado de find usando sed :

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

Extraia o terceiro resultado de find usando awk :

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

Aqui está o que parece ser o uso dos comandos em sua postagem:

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

Se você quiser manipular arquivos cujos nomes possam conter novas linhas, use a opção -print0 e faça um loop pelos resultados, por exemplo, algo como o seguinte:

find . -print0 | (\
    IFS=$'
mkdir /tmp/test

cd /tmp/test

touch $'file1 line12file1 line2'

touch $'file2 line12file2 line2'

touch $'file3 line12file3 line2'

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

Para verificar se isso funciona, você pode realizar algo como o seguinte experimento:

./file3 line1
file3 line2

Isso produz a seguinte saída (conforme esperado):

find <PATH> <EXPRESSION> | head -n 3 | tail -n 1
    
por 08.11.2017 / 23:04

Tags