"파일 입력"이 알파벳순이 아닌 숫자로 이루어지나요? [복사]

"파일 입력"이 알파벳순이 아닌 숫자로 이루어지나요? [복사]

폴더의 각 파일을 기반으로 색인을 생성하는 스크립트가 있습니다. 모든 파일 이름은 확장자를 포함한 숫자입니다.

숫자 순서대로 처리하도록 루프를 수정하려면 어떻게 해야 합니까?

for file in xml/*.xml; do
  ...
done

답변1

GNU sort구분 기호를 구분하는 옵션이 있는 경우 \0이 작업을 수행할 수 있습니다 . 이렇게 하면 while루프가 처리할 수 있도록 파일을 정렬된 순서로 가져오기 시작합니다. printf이 옵션을 사용자 정의 논리로 바꾸십시오.

shopt -s nullglob

printf '%s\0' xml/*.xml | sort -zV | while read -rd '' file; do
    printf "%s\n" "$file"
done

shopt -u nullglob

이 옵션은 현재 폴더에서 파일을 찾을 수 없는 경우 nullglob쉘이 빈 글로브를 확장하는 것을 방지하기 위한 것입니다 . 처리가 완료된 후에는 xml이 옵션이 설정 해제됩니다.-u


~처럼토니 스페이트쉘 옵션을 엉망으로 만들고 싶지 않다면(예: 다른 이유로 활성화될 수 있는 경우) 이를 서브쉘에 설정하고 글로벌 확장이 발생하도록 할 수 있습니다.

( shopt -s nullglob; printf '%s\0' xml/*.xml ) | sort -zV |  while read -rd '' file; do
    printf "%s\n" "$file"
done

답변2

zsh를 사용할 수 있는 경우(스크립트의 경우 개발 용이성과 배포 용이성이 절충됩니다):

for file in xml/*.xml(n); do
  ...
done

이것글로벌 예선 nfoo10barglob 패턴에 대한 일치 항목을 정렬할 때 숫자 시퀀스는 사전순, 즉 다음 이 아니라 나타내는 정수의 숫자 순서에 따라 정렬되어야 함을 지정합니다 foo9bar.

당신은 또한 사용할 수 있습니다setopt numeric_glob_sort모든 glob 모드가 이 설정을 사용하도록 합니다.

답변3

~을 따라쿠사로난다의 제안 중 하나:

준비하다:

mkdir xml && cd xml
touch 1.xml 10.xml 23.xml 999.xml
cd ..

반지:

for f in {1..100}; do [ -f "xml/$f.xml" ] && echo process "xml/$f.xml"; done

결과 :

process xml/1.xml
process xml/10.xml
process xml/23.xml

가장 큰 디지털 파일을 수용할 수 있을 만큼 버팀대 확장 루프를 크게 만듭니다.

답변4

ls -Q xml*.xml | while read line;do 
   ...
done

ls는 파일을 번호순으로 나열하고, -Q는 모든 공백이 처리되도록 합니다.

관련 정보