![특정 지점까지 파일 이름의 다양한 문자를 제거하는 bash 코드는 무엇입니까?](https://rvso.com/image/169414/%ED%8A%B9%EC%A0%95%20%EC%A7%80%EC%A0%90%EA%B9%8C%EC%A7%80%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%98%20%EB%8B%A4%EC%96%91%ED%95%9C%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94%20bash%20%EC%BD%94%EB%93%9C%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
문자가 다른 파일 세트가 있습니다. 예를 들어:
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
해당 옵션이 올바른 일을 한다는 확신이 들면 옵션 을 제거하세요 .