디렉터리 파일을 정렬하거나 배열에 저장하는 방법에 대한 많은 답변을 찾았습니다.
정렬 예
ls -t
배열의 디렉토리 목록
array=(*)
내 특정 문제는 파일을 특정 방식으로 정렬해야 합니다.확장하다(예 *.sh
: 수정 날짜/시간을 기준으로 정렬된 모든 파일을 배열에 저장하여 나중에 파일을 편집하거나 삭제할 때 사용할 수 있습니다.
예를 들어 배열의 파일을 정렬한 후 다음 명령을 실행하면 최신 파일을 삭제할 수 있습니다.
rm ${array[0]}
답변1
존재하다다루기 힘든이건 아주 간단해요
array=(*.sh(Nom))
이것글로벌 예선 om
수정 시간을 기준으로 일치 항목을 정렬하고(최신 항목부터) N
일치 항목이 없으면 오류를 발생시키지 않고 배열을 강제로 비웁니다.
bash와 같은 다른 쉘에는 시간별로 정렬하는 좋은 방법이 없습니다. 를 사용할 수 있지만 ls -t
출력이 명확하지 않아 중단될 수 있습니다. 파일 이름에 ls
공백이나 가 아닌 인쇄 가능한 것으로 간주되는 문자 만 포함되어 있다는 것을 알고 있는 경우 \[*?
명령 대체를 사용할 수 있습니다.
array=($(ls -t -- *.sh 2>/dev/null))
와일드카드와 가로 공백을 보호하여 더욱 강력하게 만들 수 있지만 개행 문자와 인쇄할 수 없는 문자는 여전히 문제입니다.
IFS=$'\n'; set -f
array=($(ls -t -- *.sh 2>/dev/null))
unset IFS; set +f
zsh를 제외하고 변수 값을 인용할 때 큰따옴표를 사용하는 것을 잊지 말고 --
이름이 대시로 시작하는 파일을 보호하십시오. 그렇지 않으면 옵션으로 해석됩니다.rm -- "${array[0]}"
답변2
이를 강력하게 수행하려면 ls
다음을 수행해야 합니다.아니요경로 구분 기호를 제외한 모든 항목을 분할합니다. 이것이 바로 그 용도입니다.
IFS=/; set -f
set -- $(ls -dt ./*)
shift
이것은 현재 디렉토리에서 점이 아닌 모든 파일을 정렬하고 결과를 쉘 배열에 저장합니다 $@
. POSIX가 주어지면 ls
이는 어떤 종류의 파일 이름 수정에도 영향을 받지 않습니다. 다양한 특수 문자(개행 문자 포함)가 구분된 결과에 보존됩니다. 모든(근데 마지막꺼)그러나 .
이름에는 추가 점이 추가됩니다. 결과를 보다 영구적인 배열에 넣으려면 작업을 함께 처리할 수 있습니다. 예를 들면 다음과 같습니다.
a=()
until [ -z "$2" ] &&
a+="$1" && shift
do a+="${1%?}"
shift;done
다른 사람들이 당신에게 어떤 말도 안되는 블로그를 링크하더라도 당신은할 수 있는ls
무엇을 찾아야 할지 알면 결과를 강력하게 처리할 수 있습니다.