Bash: 파일 이름에서 여러 패턴 제거

Bash: 파일 이름에서 여러 패턴 제거

basename일반적으로 파일 이름을 별도의 변수로 추출하는 데 사용하는 파일을 반복합니다 .

# remove .pdb extension from filename in new variable and print name of the file without it
for pdb in "${storage}"/complex*.pdb ; do
pdb_name=$(basename "$pdb" .pdb)
echo this is "$pdb_name" without its extension!
done

동일한 표현식을 사용하여 basename각 파일에서 여러 패턴을 제거하는 방법은 무엇입니까? 예를 들어, ".pdb" 외에도 항상 모든 파일의 시작 부분에 나타나는 "complex"도 생략하고 싶습니다(여기에서는 이를 루프에서 파일을 식별하는 패턴으로 사용합니다).

답변1

내가 아는 한, basename경로의 디렉터리가 아닌 부분에서 접두사를 제거할 수 있는 방법은 없습니다. 대신 매개변수 확장 기능을 사용하는 것이 좋습니다.

shopt -s nullglob   # Don't loop over the pattern if it matches nothing
for pdb in "$storage"/complex*.pdb
do
  pdb_name=${pdb##*/complex}
  pdb_name=${pdb_name%.pdb}
  printf '%s\n' "$pdb_name"
done

${pdb##*/complex}pdb제거된 쉘 패턴과 일치하는 가장 긴 접두사로 확장되는 값입니다 */complex.

${pdb_name%.pdb}pdb_name삭제된 쉘 패턴과 일치하는 가장 짧은 접미사로 확장되는 값입니다 .pdb.

귀하의 경우에는 이것이 문제가 되지 않지만, base_name=$(basename "$path")명령 대체 때문에 파일 이름 끝에 개행 문자를 제거하면 원치 않는 부작용이 발생할 수 있다는 점에 유의하십시오. 이 점에서는 쉘 매개변수 확장이 더 안전합니다.

관련 정보