Find 문의 세 번째 일치 항목만 표시하려면 어떻게 해야 합니까? [복사]

Find 문의 세 번째 일치 항목만 표시하려면 어떻게 해야 합니까? [복사]

내가 본 답변 중 어느 것도 나에게 도움이 되지 않았습니다. 다음과 같은 코드가 있습니다.

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

내 스크립트에는 이 이름 파일이 필요하기 때문에 FIND 문에서 세 번째 일치 항목만 원합니다.

답변1

파일 이름에 개행 문자가 포함되어 있지 않다는 것을 알고 있으면 다음 명령이 작동합니다.

findhead세 번째 결과를 사용 하고 추출합니다 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

관련 정보