특정 폴더에서 모든 쉘 스크립트를 찾아 순서대로 실행

특정 폴더에서 모든 쉘 스크립트를 찾아 순서대로 실행

내 서버를 구성하기 위한 많은 쉘 스크립트가 포함된 폴더가 있습니다.

내 기본 스크립트의 이름은 "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*.shglobbing 확장은 먼저 모든 파일을 선택한 다음 가능한 한 많은 "점 뒤에 오는 모든 것"을 제거하여 접두사를 추출하는 o표현식을 사용하여 파일을 정렬(정렬)하고 숫자로 정렬합니다.en

답변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로 바꿔 스크립트를 실행합니다.shbash

관련 정보