Find 문의 결과를 날짜별로 정렬하는 방법은 무엇입니까?

Find 문의 결과를 날짜별로 정렬하는 방법은 무엇입니까?

이름에 특정 문자열이 포함되어 있지만 출력을 정렬하는 방법을 모르는 파일을 찾으려고 하면 파일 이름만 얻을 수 있습니다.

나는 노력했다

OLDDATA=`find . -regex ".*/[0-9.]+" | ls -t`

그러나 ls -t는 찾기 결과에서는 작동하지 않지만 전체 디렉토리에서는 작동합니다.

편집: 이 명령문의 결과는 수정 날짜 디렉토리를 기준으로 정렬되어야 합니다. 이 정규식은 이름에 숫자와 점만 포함된 디렉터리와 일치하는 것으로 가정됩니다.

답변1

파일 이름만 가져오기...수정 날짜별로 정렬

find+sort+cut방법:

find . -regex ".*/[0-9.]+" -printf "%T@ %f\n" | sort | cut -d' ' -f2

  • %T@- 파일이 마지막으로 수정된 @날짜두번째Jan. 1, 1970, 00:00 GMT,소수 부분이 있기 때문에

  • %f- 모든 선행 디렉터리 파일 이름을 제거합니다(마지막 요소만).


내림차순으로 정렬하려면:

find . -regex ".*/[0-9.]+" -printf "%T@ %f\n" | sort -k1,1r | cut -d' ' -f2

답변2

귀하의 방법은 간단한 상황에 적용할 수 있습니다. 당신이 직면하는 가장 큰 문제는 당신이 통과하고 있다는 것입니다입력하다에 입력 ls하지만 ls어떤 입력도 허용하지 않습니다. ls명령줄 인수를 허용합니다. 따라서 find다음과 같이 출력을 전달해야 합니다 .논쟁에는 ls명령 대체를 사용하십시오. 또한 디렉터리가 일치하는 경우 to를 전달하면 -d해당 ls콘텐츠가 아닌 디렉터리 자체가 나열됩니다.

OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))

두 가지 제한 사항이 있으므로 간단한 경우에만 가능합니다.

  1. 이는 다음에 따라 달라집니다.따옴표 없이 명령 대체(이후 사용에도 동일하게 적용됩니다 $OLDDATA.) 따라서 파일 이름에 특수 문자(공백 또는 와일드카드 \[*?)가 포함되어 있지 않다고 가정합니다.
  2. 일부 버전에서는 ls현재 로캘에서 인쇄할 수 없는 문자가 손상될 수 있습니다.
  3. 파일 이름의 총 길이가 너무 길면 오류 메시지가 나타납니다. ( 파일 이름을 올바른 순서로 가져오려면 한 번 실행해야 하기 때문에 여기서는 도움이 될 수 없습니다 find … -exec. 그들이 할 수 있는 일은 오류를 숨기고 올바르게 정렬되지 않은 출력을 생성하는 것뿐입니다. 이 경우 더 많은 문자가 손상됩니다. 의 .)xargslsxargs

이를 수행하는 강력하면서도 간단한 방법은 다음을 사용하는 것입니다.다루기 힘든. 덕분에 와일드카드 일치 항목을 정렬할 수 있습니다.글로벌 예선.

setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
  • 다른 프로그램을 호출하지 않기 때문에 사용 가능한 메모리 외에는 길이 제한이 없으며 언제든지 파일 이름이 손상될 위험이 없습니다.
  • 밝혀지다목록문자열(각 문자열은 파일 이름)이 아니라 문자열이므로 배열 변수에 들어갑니다.
  • **/하위 디렉터리를 재귀적으로 탐색하고 find.
  • ##+(확장) 정규식 구문 과 유사한 zsh 확장 glob 구문에서 "이전 하나 이상"을 의미합니다 .
  • (om)수정 시간별로 파일을 정렬하는 데 사용되는 글로벌 한정자입니다(예: ls -t.

우리 모두 알고 있듯이 POSIX 도구나 GNU 도구 및 ksh를 사용하여 이를 강력하게 수행하는 쉬운 방법은 없습니다.

관련 정보