Findステートメントの3番目の一致のみを表示するにはどうすればよいですか? [コピー]

Findステートメントの3番目の一致のみを表示するにはどうすればよいですか? [コピー]

私が見た答えのどれも私には役に立ちませんでした。次のコードがあります。

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

私のスクリプトにはこの名前ファイルが必要なので、FINDステートメントの3番目の一致のみが必要です。

答え1

ファイル名に改行文字が含まれていないことがわかっている場合は、次のコマンドが機能します。

findhead3番目の結果を使用して抽出しますtail

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

find以下を使用して3番目の結果を抽出しますsed

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

find以下を使用して3番目の結果を抽出します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

関連情報