파일을 반복하고 해당 파일에 대한 작업을 수행합니다.

파일을 반복하고 해당 파일에 대한 작업을 수행합니다.

저는 unix 및 linux bash 스크립트를 처음 접했고 몇 가지 질문이 있습니다.

먼저 이것은 내 스크립트입니다.

for fileref in Ref/*.bed; do
    for filename in Data/*.bed; do
            bedops -e 1 $fileref $filename > "${fileref}${filename}.out"
    done
done

두 개의 파일(각 디렉터리를 반복하여 수집한)을 입력으로 사용하여 bedops -e 명령을 실행하고 출력 파일이 두 파일 이름을 연결하도록 하고 싶습니다(가급적이면 끝에 .bed가 없음). 이를 수행할 수 있는 좋은 방법이 있습니까?

답변1

당신은 그것을 사용할 수 있습니다매개변수 확장상위 디렉토리를 삭제 Ref하고 파일 이름에 접미사를 Data포함 /및 제거합니다 ..bed

  • ${varname##*/}상위 경로를 제거하려면 가장 큰 접두사 패턴을 제거하세요.
  • ${varname%.bed}.bed파일 확장자를 제거하려면 최소 접미사 패턴을 제거하세요.
for fileref in Ref/*.bed; do
    fref=${fileref##*/}
    fref=${fref%.bed}
    for filename in Data/*.bed; do
        fname=${filename##*/}
        fname=${fname%.bed}
        bedops -e 1 "$fileref" "$filename" > "${fref}${fname}.out"
    done
done

basename주어진 경로의 파일 이름을 인쇄하고 선택적으로 접미사를 제거하는 명령을 사용하여 동일한 효과를 얻을 수 있습니다.

for fileref in Ref/*.bed; do
    for filename in Data/*.bed; do
        bedops -e 1 "$fileref" "$filename" > "$(basename "$fileref" ".bed")$(basename "$filename" ".bed").out"
    done
done

답변2

basename다음을 사용하여 디렉토리(*) 및 확장자를 제거 할 수 있습니다 .

for fileref in Ref/*.bed; do
    for filename in Data/*.bed; do
        bedops -e 1 $fileref $filename > "$(basename $fileref .bed)-$(basename $filename .bed).out"
    done
done

(*) for fileref in Ref/*반복될 것이기 Ref/File1때문에 Ref/File2출력 파일을 보유하는 디렉토리는 "Ref/File1-Data/File2.out"과 같습니다.

관련 정보