그래서 bash 쉘에 파일 배열 목록이 있고 배열의 첫 번째 파일인 가장 오래된 파일부터 시작하여 수정 날짜별로 배열의 모든 파일을 정렬하고 싶습니다. 그러나 원래 배열을 정렬하고 수정하는 대신 정렬된 결과가 다른 배열에 있기를 원합니다. 나는 보았다이 스레드배열이 파일이 아니라 변수이기 때문에 수정했지만 다음 명령을 시도했습니다.
new_array=( $(ls -t $(printf '%s\n' "${array_list[@]}")) )
그러나 배열이 너무 커서 ls가 인수 목록을 "너무 길다"고 보고합니다.
가장 오래된 파일부터 시작하여 수정 날짜별로 기본 배열을 정렬하고 결과를 다른 배열에 저장하는 다른 방법이 있습니까?
답변1
최신 버전의 GNU ls
및 GNU를 사용하면 bash
다음을 수행할 수 있습니다.
readarray -td '' new_array < <(
ls --zero -dt -- "${array_list[@]}")
execve()
그러나 이는 매개변수 + 환경 길이 제한을 우회하지 않습니다 .예ls
이 매개변수 목록을 사용하여 실행합니다. printf
실행 불가능한 함수나 내장 함수 에 목록을 전달하여 execve()
인수 대신 stdin에서 목록을 읽을 수 있는 명령에 공급할 수 있습니다.
최신 버전의 GNU find
(및 GNU sort
및 GNU cut
):
print0() { [ "$#" -eq 0 ] || printf '%s\0' "$@"; }
readarray -td '' new_array < <(
print0 "${array_list[@]}" |
find -files0-from - -prune -printf '%T@\t%p\0' |
sort -rzn |
cut -zf2 -)
또는 GNU를 사용 stat
하고 배열 요소가 없다고 가정합니다 -
.
print0() { [ "$#" -eq 0 ] || printf '%s\0' "$@"; }
readarray -td '' new_array < <(
print0 "${array_list[@]}" |
xargs -r0 stat --printf='%.Y\t%n\0' --
sort -rzn |
cut -zf2 -)
zsh
내장된 것이 있습니다 stat
(GNU 이전 버전). 따라서 여기에서 직접 다음을 수행할 수 있습니다.
zmodload zsh/stat
typeset -A mtime
stat -nLA mtime -F %s%9. +mtime -- $array_list
new_array=( /(Ne['reply=($array_list)']nOe['REPLY=$mtime[$REPLY]']) )
이는 파일을 생성 시간에 매핑하기 위한 연관 배열을 구축하고 $mtime
A
(숫자용) glob 한정자를 사용하여 목록을 정렬합니다.Oe
n