파일 이름에서 특정 문자를 제거하는 bash 코드는 무엇입니까?

파일 이름에서 특정 문자를 제거하는 bash 코드는 무엇입니까?

다른 문자를 가진 파일 세트가 있습니다. 예를 들어:

IDNR19_15_037_S514_L001_R1_001.fastq
IDNR19_02_016_S238_L001_R1_001.fastq

S514이전의 모든 문자를 제거하고 S238이후의 모든 문자를 유지하고 싶습니다 . 내 예에서와 같이 파일의 번호가 다를 때 이것이 가능합니까?

약 1,100개의 파일이 있으므로 수동으로 수행하려면 시간이 많이 걸립니다.

내가 할 수 있는 가장 가까운 것은 다음과 같습니다.

rename 's/IDNR19_//g' *.fastq

IDNR19_ 부분을 제거했지만 문제가 해결되지 않습니다.

답변1

변수나 텍스트 파일에 저장된 문자열이 아니라 이름을 바꾸려는 디스크의 파일 이름이라고 가정합니다. 간단한 쉘 루프를 사용할 수 있습니다.

for name in *.fastq; do
    newname=${name#*_*_*_}
    printf 'Would move "%s" to "%s"\n' "$name" "$newname"
    # mv -i -- "$name" "$newname"
done

이는 패턴과 일치하는 현재 디렉토리의 모든 이름을 반복합니다 *.fastq(패턴을 로 변경하여 패턴에 대해 더 구체적으로 지정할 수 있음 IDNR*.fastq). 각 파일 이름에 대해 파일 이름 와일드카드 패턴과 일치하는 접두사를 제거하여 새 이름을 구성합니다 *_*_*_. 이는 다음을 사용하여 수행됩니다.표준 매개변수 확장.

이는 보안상의 이유로 mv주석 처리되었습니다 . 활성화 시 mv.

다양한 유틸리티 rename(Perl 모듈 기반 유틸리티 File::Rename, 다양한 유틸리티가 있음, " 참조) 중 하나를 사용하십시오.이름 바꾸기, 이름 바꾸기, 파일 이름 바꾸기 등 모든 이름 바꾸기 작업은 어떻게 되나요?"):

rename -n -v 's/.*?_.*?_.*?_//' -- *.fastq

또는 더 짧거나,

rename -n -v 's/(.*?_){3}//' -- *.fastq

이는 위의 쉘 코드와 거의 동일한 작업을 수행하지만 대신 Perl을 사용합니다. 대체는 비탐욕적 일치를 사용하여 밑줄 사이의 세 하위 문자열을 일치시켜 .*파일 이름 문자열의 초기 비트를 제거합니다 . -n해당 옵션이 올바른 일을 한다는 확신이 들면 옵션을 제거하세요.

관련 정보