Bash에서 파일 이름을 바꿀 때 파일 이름의 하위 문자열 순서를 바꾸시겠습니까?

Bash에서 파일 이름을 바꿀 때 파일 이름의 하위 문자열 순서를 바꾸시겠습니까?

수백 개의 파일이 있는데 모두 동일한 템플릿을 따르는 이름을 가지고 있습니다.

results_20210503_input003_run017_cluster003.txt

Bash에서 하위 문자열을 재정렬하는 유효한 방법입니까?

results_input003_cluster003_run017_20210503.txt

cut -f$i을 사용하여 각 필드를 가져온 다음 을 mv사용하여 파일 이름을 바꾸려고 생각했지만 투박해 보입니다.

답변1

사용펄의 rename명령줄도구(운영 체제에 따라 또는 라고 rename불릴 수 있음 ):perl-renameprename

rename 's/(results)(_[0-9]{8})(.*)(\.txt)/$1$3$2$4/' results*txt

-n이름 변경을 표시하려면 - 플래그를 사용하여 시험 실행해 보세요.

작동 방식:

  • s/A/B/- 파일 이름의 패턴 A를 패턴 B로 바꿉니다.
  • 괄호 안의 패턴은 발생 시 색인 번호가 할당됩니다.
  • 그룹화에는 다음이 포함됩니다. 1) results: 리터럴 "결과"; 2) _[0-9]{8}: 밑줄 뒤에 0부터 9까지의 8자리 숫자; 3) .*.=모든 문자, *=가능한 한 이전 입력을 반복합니다. 4) \.txt리터럴 ".txt"는 .이스케이프되어야 합니다. 그렇지 않으면 (3)과 같이 "모든 문자"가 됩니다.
  • 필요에 따라 패턴 그룹을 재정렬합니다. 다음을 참조하세요.$<ID>

답변2

운영 체제에 대해 언급하지 않았으므로 어떤 도구를 사용할 수 있는지 추측하기 어렵습니다. 나는 mmv이와 같은 상황이 가장 쉽다고 생각합니다. 정규식 대신 쉘 글로브를 사용합니다.

$ mmv -n 'results_*_*_*_*.txt' 'results_#2_#4_#3_#1.txt'
results_20210503_input003_run017_cluster003.txt -> results_input003_cluster003_run017_20210503.txt

-n제안된 이름 변경에 만족하면 삭제하세요.


꼭 해야 한다면"배쉬에서", 그 다음에

for f in results_*.txt; do 
  IFS=_ read -a elems <<<"${f%.txt}"
  echo mv -n "$f" "results_${elems[2]}_${elems[4]}_${elems[3]}_${elems[1]}.txt"
done
mv -n results_20210503_input003_run017_cluster003.txt results_input003_cluster003_run017_20210503.txt

echo실제로 파일 이름을 바꾸려면 삭제하세요 .

관련 정보