내 서버를 구성하기 위한 많은 쉘 스크립트가 포함된 폴더가 있습니다.
내 기본 스크립트의 이름은 "setup.sh"이고 다른 모든 스크립트의 이름은 0.script.sh, 1.script.sh..., 보다 일반적으로는 N.SCRIPT_NAME.sh입니다. 여기서 N은 실행 번호입니다.
그래서 해당 폴더에 있는 모든 쉘 스크립트를 나열하고 N 번호에 지정된 순서대로 실행하려고 합니다.
답변1
zsh를 사용하여 파일 이름을 순서대로 가져오는 더 쉬운 방법이 있을 수 있지만 다음은 bash의 무차별 접근 방식입니다.
for script in ?.script*.sh ??.script*.sh ???.script*.sh ????.script*.sh
do
printf "Executing script: %s\n" "$script"
./"$script"
done
이는 스크립트의 파일 이름 접두사 부분에 9999개 이하, 더 정확하게는 4개 이하의 숫자(문자)가 있다고 가정합니다.
또한 접두사가 다음과 같다고 가정합니다.번호가 매겨진- 그것~ 할 것이다예를 들어 명명된 스크립트를 선택합니다( go.script_X.sh
있는 경우). 해결책저것?
는 다음으로 대체됩니다 [0-9]
.
for f in [0-9].script*.sh [0-9][0-9].script*.sh ...
쉘의 자연스러운 글로빙 메커니즘은 결과 파일 이름을 알파벳순으로 정렬하므로 숫자순으로도 정렬됩니다. 다양한 파일 이름은 점점 더 많은 비율로 표기되므로 "9"가 "101" 앞에 오는 식입니다.
zsh에서는 접두사를 기준으로 숫자 순서로 glob 파일 이름을 지정합니다.
for script in *.script*.sh(oe_'REPLY=${REPLY%%.*}'_n)
do
printf "Executing script: %s\n" "$script"
./"$script"
done
*.script*.sh
globbing 확장은 먼저 모든 파일을 선택한 다음 가능한 한 많은 "점 뒤에 오는 모든 것"을 제거하여 접두사를 추출하는 o
표현식을 사용하여 파일을 정렬(정렬)하고 숫자로 정렬합니다.e
n
답변2
파일 이름이 단순하다면(공백 없음, 개행 문자 없음, ls로 인코딩해야 하는 문자 없음 ?
) 그렇다면 아마도 가능합니다! ! , 다음을 제거할 수 있습니다.
IFS=$' \t\n'; for s in $(ls -v folder/*.script.sh); do printf '%s\n' "$s"; done
이 경우 정렬은 버전 번호 (숫자 값과 유사) ls
를 기준으로 수행됩니다 .-v
그러나 일반적으로 출력을 구문 분석(처리)하는 것은 좋지 않은 생각입니다 ls
.
이것이 더 좋습니다:
shopt -s nullglob
for s in folder/?{,?{,?{,?}}}.script.sh
do printf '%s\n' "$s"
done
.script.sh
각각 최대 4자(숫자)로 나열됩니다(알파벳순, 앞의 문자가 숫자일 경우 숫자순과 동일).
아이디어는버팀대 확장전에 일어난경로명 확장. 이것버팀대 확장?{,?{,?{,?}}}.script.sh
으로 변환 및 확장됩니다 .
?.script.sh ??.script.sh ???.script.sh ????.script.sh
그 다음에,경로명 확장각 패턴과 일치하는 모든 파일을 찾아 각 패턴을 차례로 정렬합니다.
위의 옵션 중 어느 것도 문제를 해결하지 못하는 경우 다음을 사용해야 합니다 sort
.
printf '%s\n' *.script.sh | sort -n | xargs echo
접두사 가 있으면 folder
상황이 더 복잡해집니다.
printf '%s\n' folder/*.script.sh | sort -n -k 1.8 | xargs echo
여기서 8은 단어의 문자 수(바이트)이고 folder
그 뒤에 /
1이 옵니다.
echo
대체를 사용하여 각 스크립트를 실행해야 합니다 sh
. 이 방법은 파일 이름에 개행 문자가 포함되어 있지 않으면 제대로 작동합니다.
파일 이름에 개행 문자가 포함될 수 있는 경우 다음 명령을 사용하십시오.
printf '%s\0' folder/*.script.sh | sort -zn -k 1.8 | xargs -0 -I{} echo '{}'
다시 (또는 ) echo
로 바꿔 스크립트를 실행합니다.sh
bash