동일한 구분 기호를 사용하는 여러 인스턴스의 디렉터리 이름 잘라내기(셸)

동일한 구분 기호를 사용하는 여러 인스턴스의 디렉터리 이름 잘라내기(셸)

이름을 바꾸려는 디렉터리가 있습니다. 예를 들면 다음과 같습니다.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

관련 정보