특정 확장자로 디렉토리 이름 바꾸기

특정 확장자로 디렉토리 이름 바꾸기

내가 물었던 이전 질문을 확장하면 다음과 같습니다. 영숫자 파일 이름 바꾸기

확장자가 *_upstream인 하위 디렉터리가 포함된 디렉터리가 있습니다.

DHX30_vs_Control18.txt_events_without_u2af1_srsf2_altexons_upstream
GEMIN5_vs_Control19.txt_events_without_u2af1_srsf2_altexons_upstream

첫 번째 "_" 이후의 모든 항목을 제거하여 이름을 바꾸고 싶습니다.

DHX30
GEMIN5

답변1

for dir in ./*_*_upstream/
do 
  mv -- "$dir" "${dir%%_*}"
done

위의 루프는 패턴과 일치하는 현재 디렉터리의 모든 디렉터리를 선택합니다(후행 슬래시가 수행함): "(something) underscore (something) underscore upstream"). 그런 다음 가장 긴 일치 항목을 제거하기 위해 매개변수 확장을 사용하여 이러한 디렉터리의 이름을 바꿉니다. 즉, 첫 번째 밑줄과 그 뒤의 모든 항목을 제거하는 "밑줄(아무거나)"입니다.

예를 들어:

설정:

mkdir DHX30_foo_upstream
mkdir GEMIN5_vs_Cblah_upstream
touch DX31_foo_upstream

결과:

$ tree
.
├── DHX30
├── DX31_foo_upstream
└── GEMIN5

2 directories, 1 file

답변2

Linux의 경우:

rename -v 's/_.*//' *_upstream/

관련 정보