Bash for 루프는 하나를 제외하고 폴더의 모든 파일을 처리합니다. [중복]

Bash for 루프는 하나를 제외하고 폴더의 모든 파일을 처리합니다. [중복]

9개의 Robot Framework 테스트 파일이 포함된 폴더가 있습니다. 그 중 8개만 실행하면 됩니다. 마지막 것은 다른 모든 것을 설정하는 데 사용되기 때문입니다(우리는 이것을 이라고 부릅니다 config.robot).

이 모든 테스트를 실행해야 한다면 다음과 같은 작업을 수행할 것입니다.

for test_file in folder/*.robot; do
    robot -b debug.log -d log/ $test_file.robot;
done

하지만 이 경우에는 실행도 가능하다는 뜻인데 config.robot, 이는 제가 원하지 않습니다.

하나를 제외하고 폴더의 모든 파일에 대해 for 루프를 수행하는 방법은 무엇입니까?

이것이 도움이 된다면, config.robot제외한 모든 파일은 다음 명명 구문을 따릅니다. 모두 실행 순서로 시작하고 그 뒤에 실제 이름이 옵니다 01__init-connection.robot.


편집하다:이 질문을 게시하기 전에 제공된 답변을 보고 시도했습니다.전역 일치에서 패턴 제외그리고 다음과 같은 것을 썼다

shopt -s extglob
for test_file in folder/!(config).robot; do ...

그러나 Robot Framework는 파일 이름을 인식하지 못합니다.

Parsing 'folder/!(config).robot' failed: Data source does not exist.

그래서 로봇 프레임워크는 이 구문을 좋아하지 않는 것 같습니다.
내 파일 이름 구조와 일치하는 정규식을 기반으로 찾기 결과를 사용하여 변수를 설정한 다음 해당 변수에 대해 for 루프를 수행하려고 합니다.

SUITES=$(find . -regex '^[0-9][0-9][a-zA-Z_-]*')
for SUITE in $SUITES; do robot -b ...

그러나 어떤 이유로 내가 echo욕실에 있을 때는 아무것도 반환하지 않습니다. 내가 여기서 무엇을 놓치고 있는지 모르겠습니다.

답변1

Bash에서 태그는 다음과 같습니다.

shopt -s extglob
for test_file in folder/!(config).robot; do robot -b debug.log -d log/ "$test_file".robot; done

응답 업데이트:

shopt -s extglob
for test_file in folder/!(config).robot; do ...

다음으로 이어진다:

'folder/!(config).robot' 구문 분석 실패: 데이터 소스가 존재하지 않습니다.

"폴더"에 "config.robot" 외에 ".robot" 파일이 없는 경우 이러한 현상이 발생할 수 있습니다. 고려하다:

$ mkdir folder
$ touch folder/config.robot
$ shopt -s extglob
$ shopt -u nullglob
$ for f in folder/!(config).robot; do ls --- "$f"; done
ls: cannot access folder/!(config).robot: No such file or directory

대비(새로운 시작):

$ mkdir folder
$ touch folder/config.robot
$ shopt -s extglob
$ shopt -s nullglob
$ for f in folder/!(config).robot; do ls -- "$f"; done
$

여기서 for와일드카드는 어떤 파일로도 확장되지 않기 때문에 루프는 명령을 실행하지 않습니다.

아니면 대안으로비config.robot 파일은 다음과 같습니다.

$ mkdir folder
$ touch folder/config.robot
$ touch folder/01__init-connection.robot
$ shopt -s extglob
$ shopt -s nullglob
$ for f in folder/!(config).robot; do ls -- "$f"; done
folder/01__init-connection.robot

답변2

이 명령을 사용할 수 있습니다 continue.

또한 이 변수는 전체 경로를 선택한다는 점에 유의하세요.

for f in folder/*.robot; do
    test "$f" = folder/config.robot && continue 
    robot -b debug.log -d log/ "$f"
done

답변3

이 시도,

for test_file in folder/*.robot; 
do 
    [ "$test_file" != "config.robot" ] && robot -b debug.log -d log/ $test_file.robot;
done
  • robot$test_file다음과 같지 않은 경우에만 실행됩니다.config.robot

또는 단순히 사용find

find folder/*.robot ! -name "config.robot" -exec robot -b debug.log -d log/ {} +

관련 정보