특정 지점까지 파일 이름의 다양한 문자를 제거하는 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해당 옵션이 올바른 일을 한다는 확신이 들면 옵션 을 제거하세요 .

관련 정보