find 문에서 awk 명령이 작동하지 않습니다.

find 문에서 awk 명령이 작동하지 않습니다.

이름에 숫자와 점 또는 @tmp가 포함된 모든 디렉터리를 찾아 날짜별로 정렬한 다음 세 번째 문의 결과를 변수에 저장하는 스크립트를 작성했습니다. 하지만 이것은 항상 나에게 첫 번째 쿼리 결과를 제공합니다. 올바른 결과를 얻으려면 어떻게 해야 합니까?

TL;DR 일치하는 디렉터리를 날짜별로 정렬하고 해당 목록의 세 번째 디렉터리 이름을 인쇄하고 싶습니다.

OLDDATA=`find . \( -name '*@tmp' -o -regex '.*/[0-9.]+' \) -exec ls -t {} + | awk "NR==3 { print }" `

ls -t 결과 예

./1.2.3.4.5.6.102: ./1.2.3.4.5.6.101: ./1.2.3.4.5.6.100: ./1.2.3.4.5.6.99:
./1.2.3.4.5.6.98: ./1.2.3.4.5.6.97: ./1.2.3.4.5.6.96: ./1.2.3.4.5.6.95:
./1.2.3.4.5.6.94: ./1.2.3.4.5.6.93: ./1.2.3.4.5.6.92: ./1.2.3.4.5.6.91:
./1.2.3.4.5.6.90: ./1.2.3.4.5.6.89: ./1.2.3.4.5.6.88: ./1.2.3.4.5.6.87:

답변1

특정 경우에 올바른 설명은 다음과 같습니다.

find . \( -name '*@tmp' -o -regex '.*/[0-9.]+' \) -exec ls -t {} \; | awk 'NR==3'

답변2

나는 아마도 다음과 같은 접근 방식을 택할 것입니다(가독성을 위해 여러 줄로 나누고 한 줄로 연결하기만 하면 됩니다).

ls -td $(
    find . -maxdepth 1 -type d \( -name '@tmp' -o -regex '.*/[0-9.]+' \)
) |
    sed -n '3{p;q}'

일치하는 디렉터리 이름을 찾아 날짜 순서로 나열한 다음 해당 목록의 세 번째 항목만 인쇄합니다. (이 경우 lsfrom을 사용하여 출력을 정렬하는 것은 find허용됩니다. 경로 이름에 공백이나 기타 어색한 문자가 포함되지 않도록 할 수 있기 때문입니다. 일반적인 경우 이는 잘못된 가정입니다.)

:콜론( )으로 끝나는 디렉토리와 일치하지 않습니다 (그러나 질문의 ​​원래 RE와도 일치하지 않습니다).


나는 귀하의 초기 진술이 귀하가 명시한 목표를 달성하지 못한 이유(제가 생각했던 것)를 설명하는 것이 유용할 것이라고 생각했습니다.

한 번 보자 find:

find . \( -name '*@tmp' -o -regex '.*/[0-9.]+' \) -exec ls -t {} +

이는 이름이 숫자 .. 또는 점 으로 끝나 @tmp거나 이것으로만 구성된 파일 또는 디렉토리와 일치합니다 . 두 패턴 중 하나와 일치하는 파일이나 디렉터리가 발견되면 목록에 추가됩니다. 목록에 반드시 일치하는 항목이 모두 포함될 필요는 없습니다.09.그렇다고 가정하면 안 된다. 목록이 "충분히 길면" 에 전달됩니다 ls -t. 이 작업을 두 번 이상 수행할 수 있으며 ls -t, 각 실행은 서로 다른 파일 및 디렉터리 이름 집합을 정렬하고 나열합니다.

내 시스템에서는 ls -t파일이 먼저 나열되고 수정 날짜를 기준으로 내림차순으로 정렬됩니다. 수정된 날짜의 내림차순으로 디렉토리 이름을 정렬하고 각 디렉토리 이름의 이름을 인쇄합니다.그리고 그 내용(또한 날짜 내림차순으로 정렬됩니다.) 사용해야 하는 것을 생략하려면 ls -td.

안전을 위해, find ... -type d ... -exec ls -dt {} +표현된 목록에 얼마나 많은 디렉토리 이름이 전달될지 알 수 없기 때문에 이를 사용할 수도 없습니다 {}.

한 번 보자 awk:

awk "NR==3 { print }"

{ print; exit}세 번째 항목이 인쇄되자마자 처리를 중단 하는 경향이 있지만 괜찮습니다 .

관련 정보