다른 문자를 가진 파일 세트가 있습니다. 예를 들어:
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
해당 옵션이 올바른 일을 한다는 확신이 들면 옵션을 제거하세요.