중간 문자열을 파일 이름 끝으로 이동하여 파일 이름을 바꿉니다.

중간 문자열을 파일 이름 끝으로 이동하여 파일 이름을 바꿉니다.

일부 데이터 파일이 있는데 파이프라인에 맞게 이름을 바꾸고 싶습니다.

파일은 다음과 같습니다.

{unique_ids}_{experiment_condition}_L{3_digit_number}.txt

다음과 같이 파일 이름 끝, 확장자 앞에 실험 조건 플래그가 표시되도록 이름을 바꿔야 합니다.

{unique_ids}_L{3_digit_number}_{experiment_condition}.txt

Unique_ids 및 Experiment_condition의 길이는 고정되어 있지 않습니다.

예:

ghad312fd2_Mb_L002.txt이 되다 ghad312fd2_L002_Mb.txt.

감사합니다!

답변1

Perl 기반 rename유틸리티를 사용하여 현재 디렉터리에서 이 패턴과 일치하는 모든 파일 ./*_*_*.txt(즉, 이름에 두 개 이상의 밑줄이 포함되고 로 끝나는 모든 파일 .txt)의 이름을 바꿉니다.

rename -n 's/([^_]+)_([^_]+)\.txt$/$2_$1.txt/' ./*_*_*.txt

파일 이름 접미사를 제외하고 파일 이름의 마지막 두 밑줄로 구분된 부분을 바꿉니다 .txt. -n올바른 작업을 수행하는 것으로 보이는지 확인한 후 제거하여 실제로 실행하십시오.

답변2

쉘 포함 zsh:

autoload zmv
zmv  -n '(*)(_*)(_L[0-9](#c3))(.txt)' '$1$3$2$4'

( -n만족하면 삭제(테스트 실행)).

[0-9](#c3)3개의 ASCII 10진수 시퀀스와 일치합니다. 또한 이를 사용하여 <0-999>0부터 999까지의 숫자(0000123과도 일치할 수 있음) 또는 <->모든 숫자(하나 이상의 ASCII 10진수 시퀀스)를 일치시킬 수 있습니다.

답변3

또한 시도

for FN in gh*; do IFS="_." read ID XC NR EXT <<< "$FN"; echo mv -- "$FN" "${ID}_${NR}_${XC}.${EXT}"; done  

read"string here"에 있는 각 파일 이름의 4개 변수를 사용하고 이를 기반으로 새 파일 이름을 재구성합니다 . echo보시는 내용이 마음에 드시면 삭제하세요.

답변4

unique_ids밑줄이 없다고 가정하고 이를 스크립트에 넣고 GNU sed또는 기타 sed지원되는 스크립트를 사용하여 실행 -E하고 파일 이름을 인수로 전달합니다.

#!/bin/bash
for f in "$@" ; do
    new_name=$(echo "$f" | sed -E 's/([^_]+)_(.+)_(L[0-9]{3})\.txt/\1_\3_\2.txt/g')
    echo "$f -> $new_name"
    mv "$f" "$new_name"
done

관련 정보