이름을 바꾸려는 디렉터리가 있습니다. 예를 들면 다음과 같습니다.10-00017_S9_L001_plasmidspades_careful
10-00017_S9_L001
섹션 이름을 바꾸고 싶습니다.
cut 명령을 사용해 보았 echo "$filename" | cut -d'_' -f3
으나 파일 이름 중 L001 부분만 남게 되었습니다.
분명히 수동으로 이름을 바꿀 수 있지만 수백 개의 디렉토리가 있고 시간이 없습니다.
cut 명령을 사용하여 구분 기호의 특정 인스턴스 앞의 모든 항목을 가져오는 방법이 있습니까? 아니면 실제로 사용할 수 있는 다른 항목이 있습니까?
답변1
가장 좋은 해결책은 rename
(Debian) 또는 prename
(RedHat)(동일한 명령, 다른 이름)을 사용하는 것입니다(이러한 패키지는 표준 배포 저장소에서 추가해야 할 수도 있습니다). 정규식(Perl 스타일)을 사용합니다. 예를 들어, 경쟁에 엄격해지도록 노력해보세요.
rename -n 's/(\d+_\d+_S\d_L\d+)_.+/$1/' *
또는 더 느슨하게:
rename -n 's/(.+_.+_.+_.+)_.+/$1/' *
실제 실행을 위해 -n
무엇을 할 것인지, 제거(또는 로 대체하는 것이 더 좋음)를 보여줍니다 .-v
bash가 백슬래시와 달러를 바꾸는 것을 방지하려면 패턴 주위에 작은따옴표를 기록하십시오.
답변2
상당히 낮은 수준의 기술 솔루션:
- 파일에서 디렉터리 목록을 사용
ls
하거나 생성합니다.find
- 익숙한 편집기를 사용하여 각 줄을 바꿉니다(로만 가능
oldname
)mv oldname newname
. 스크립트를 실행합니다.
. list_of_moves
(선행 포인트 간격에 유의하세요)
답변3
모든 디렉터리를 파일에 넣고 다음 명령을 실행하여 이름을 바꿉니다.
awk '{print "mv" " " $1 " " substr($1,1,16)}' filename | sh
위의 Dirtectoy를 테스트했는데 훌륭하게 작동합니다.
echo "10-00017_S9_L001_plasmidspades_careful" | awk '{print "mv" " " $1 " " substr($1,1,16)}' | sh