이름이 포함된 디렉터리와 거의 일치하는 파일을 찾는 방법

이름이 포함된 디렉터리와 거의 일치하는 파일을 찾는 방법

시스템을 실행하기 위해 원격 서버의 Jenkins에서 실행할 스크립트를 작성하려고 합니다. 시스템은 확장자로 구별되는 다양한 형식의 파일을 가져올 수 있습니다. 우리 resources는 하위 디렉토리에 다양한 형식의 테스트 데이터를 가지고 있습니다.

resources/datasetA/datasetA.format1
resources/datasetB/datasetB.format1
resources/datasetC/datasetC.format2
etc.

일반적으로 데이터 세트 디렉터리와 추가 하위 디렉터리에는 다른 파일이 있습니다.

위에 나열된 가져오기 소스 파일을 선택하려고 하는데 운이 없습니다.

내 초기 생각은

for dir in $(ls -d resources/*/)
do
    dataset=$(echo ${dir%/} | xargs basename)
    source=$(ls resources/$dataset/$dataset.*)
    .
    .
    .
done

로컬 컴퓨터의 cygwin 창에 이것을 입력하면 제대로 작동하지만 ls resources/$dataset/$dataset.*여러 파일이 반환되는 것처럼 보이는 원격 컴퓨터에서는 실패합니다. 디렉토리 내용은 로컬 및 원격 시스템에서 동일하며 왜 이런 일이 발생하는지 이해할 수 없습니다.

그런 다음 resources/$dataset의 모든 파일을 나열하고 $dataset와 일치하는 기본 이름 확장자가 없는 마지막 파일을 식별합니다.

for dir in $(ls -d resources/*/)
do
    dataset=$(echo ${dir%/} | xargs basename)
    find resources/$dataset -maxdepth 1 -type f | while read fnm
    do
        baseFnm=$(basename $fnm)
        if [ ${baseFnm%.*} = $dataset ]
        then
            source=$fnm
        fi
    done
    # Exercise the system using $source
done

하지만 source사용하려고 하면 비어 있습니다. if구조에 추적을 추가하고 테스트가 성공하는지 확인할 수 있기 때문에 이에 대해 매우 혼란스럽습니다.

두려워할 것은 없습니다. 테스트가 성공하면 루프에서 벗어나려고 시도하지만 이 경우에는 fnm비어 있습니다.

돕다!

답변1

일반적으로 출력을 구문 분석하는 것은 좋지 않습니다 ls.

아마도 다음이 도움이 될까요?

for d in resources/*/
do
    rn=${d%/};rn=${rn##*/}
    for f in "$d$rn."*
    do
       [ -f "$f" ] && printf '%s\n' "$f"
    done
done

Jenkins와 원격 시스템을 사용하고 있다고 언급하셨습니다. 문제의 가장 큰 원인은 따옴표, 특히 달러 기호가 누락되었기 때문입니다. 이 스크립트를 어떻게 호출하나요?

관련 정보