ls
해당 옵션을 사용하면 출력을 시간별로 정렬 할 수 있다는 것을 알고 있습니다 -t
.
파일이 너무 많아서 한 번의 ls
호출에 맞지 않을 경우 일반적으로 xargs
(또는 find ... -exec ... {} +
)를 사용하여 ls
여러 번 호출할 수 있다는 것을 알고 있습니다.
이 둘을 어떻게 결합할 수 있나요? 명령줄에 들어갈 수 있는 것보다 더 많은 파일이 있고 시간별로 정렬하여 나열하고 싶습니다. 명령줄에 정확히 1000개의 파일 이름이 있고 3000개의 파일이 존재한다고 가정하면 이것이 실행되고 마지막 1000개의 파일은 처음 1000개의 파일보다 더 빠른 수정 시간을 볼 가능성이 높기 find . -type f -exec ls -t {} +
때문에 작동하지 않습니다 . 관련되거나 동등한 작업이 수행될 가능성이 없는 것 같습니다 . 이 접근 방식은 근본적으로 결함이 있는 것 같지만 방법을 찾을 수 없습니다.ls -t [first 1000 files]; ls -t [second 1000 files]; ls -t [last 1000 files]
find
xargs
하다일하다.
답변1
ls -t
그 자체로는 명령줄에 나열할 필요 없이 현재 디렉터리의 모든 파일을 해당 순서대로 나열합니다.
재귀적 동작이 필요 find
하거나 파일에 대해 다른 테스트를 수행하는 경우 타임스탬프가 있는 항목을 생성하고 GNU 옵션을 통해 정렬 find
할 수 있습니다. 그것은 다음과 같습니다:stat
find
-printf
find . -type f -printf '%T@ %p\0' | sort -zn
-printf '%T@ %p\0'
널로 구분된 Unix 타임스탬프( %T@
)-파일 이름( %p
) 쌍을 생성합니다.sort -z
또한 파일 이름 보안을 보장하기 위해 null로 구분된 레코드를 사용하는 비표준 GNU 확장입니다. sort
대부분의 BSD도 이 옵션을 지원하지만, -printf
내가 아는 한 GNU만 지원합니다.
해당 출력을 파일 이름이나 원하는 다른 형식으로 다시 잘라낼 수 있습니다.
답변2
Posixly find
와 함께 사용할 수 있습니다 .perl
$ find ! -name . -prune -print | perl -lne '
$h{$_} = -M;
END { print for sort {$h{$a} <=> $h{$b}} keys %h }
'
이는 파일 이름에 개행 문자가 없다고 가정합니다.
줄 바꿈을 처리하려면 다음을 수행할 수 있습니다.
$ find ! -name . -prune -exec printf "%s\0" {} + | perl -0lne ...
또는 코드에서 then을 사용하세요 perl -le
.split /\0/,<>
답변3
zsh에서:
print -rl -- *(om)
이것글로벌 예선 om
수정 시간을 기준으로 파일을 정렬합니다(시간 역순, 예: 최신 항목부터 ls -t
). Om
역순(예: 연대순)을 가져오는 데 사용됩니다 ls -tr
. *(Dom)
도트 파일을 포함하도록 만드세요 .
물론 변경할 수 있습니다.무늬, 예를 들어 **/*(Dom)
하위 디렉터리로 반복됩니다. 여러 패턴을 사용하려면 괄호 안에 넣고 |
연산자(예: )를 사용하여 구분하세요 *.(png|jpg)(om)
.
print
쉘 내장 명령이므로 이 명령은 최대 명령줄 길이 제한의 영향을 받지 않습니다 . 파일을 일괄적으로 순차적으로 작업하기 위해 외부 명령을 호출하려는 경우 길이 제한이 발생합니다. printf '%s\0' *(om) | xargs -0 somecommand
xargs가 null로 구분된 입력(Linux, *BSD) 또는 zsh 자체 입력을 지원하는 경우 다음을 사용하여 xargs에 파일을 제공할 수 있습니다.zargs
:
autoload -U zargs
zargs -r -e '' -- *(om) '' somecommand
한 번에 하나의 파일을 처리하려면 간단한 루프를 사용하십시오. zsh를 사용하면 이를 축약할 수 있습니다(csh 스타일).
for x (*(om)) somecommand