저는 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"과 같습니다.