私が見た答えのどれも私には役に立ちませんでした。次のコードがあります。
OLDVER=`readlink current`
OLDDATA=`find ! -newer $OLDVER
私のスクリプトにはこの名前ファイルが必要なので、FINDステートメントの3番目の一致のみが必要です。
答え1
ファイル名に改行文字が含まれていないことがわかっている場合は、次のコマンドが機能します。
find
head
3番目の結果を使用して抽出します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