이름에 특정 문자열이 포함되어 있지만 출력을 정렬하는 방법을 모르는 파일을 찾으려고 하면 파일 이름만 얻을 수 있습니다.
나는 노력했다
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.]+"))
두 가지 제한 사항이 있으므로 간단한 경우에만 가능합니다.
- 이는 다음에 따라 달라집니다.따옴표 없이 명령 대체(이후 사용에도 동일하게 적용됩니다
$OLDDATA
.) 따라서 파일 이름에 특수 문자(공백 또는 와일드카드\[*?
)가 포함되어 있지 않다고 가정합니다. - 일부 버전에서는
ls
현재 로캘에서 인쇄할 수 없는 문자가 손상될 수 있습니다. - 파일 이름의 총 길이가 너무 길면 오류 메시지가 나타납니다. ( 파일 이름을 올바른 순서로 가져오려면 한 번 실행해야 하기 때문에 여기서는 도움이 될 수 없습니다
find … -exec
. 그들이 할 수 있는 일은 오류를 숨기고 올바르게 정렬되지 않은 출력을 생성하는 것뿐입니다. 이 경우 더 많은 문자가 손상됩니다. 의 .)xargs
ls
xargs
이를 수행하는 강력하면서도 간단한 방법은 다음을 사용하는 것입니다.다루기 힘든. 덕분에 와일드카드 일치 항목을 정렬할 수 있습니다.글로벌 예선.
setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
- 다른 프로그램을 호출하지 않기 때문에 사용 가능한 메모리 외에는 길이 제한이 없으며 언제든지 파일 이름이 손상될 위험이 없습니다.
- 밝혀지다목록문자열(각 문자열은 파일 이름)이 아니라 문자열이므로 배열 변수에 들어갑니다.
**/
하위 디렉터리를 재귀적으로 탐색하고find
.##
+
(확장) 정규식 구문 과 유사한 zsh 확장 glob 구문에서 "이전 하나 이상"을 의미합니다 .(om)
수정 시간별로 파일을 정렬하는 데 사용되는 글로벌 한정자입니다(예:ls -t
.
우리 모두 알고 있듯이 POSIX 도구나 GNU 도구 및 ksh를 사용하여 이를 강력하게 수행하는 쉬운 방법은 없습니다.