수백 개의 파일이 있는데 모두 동일한 템플릿을 따르는 이름을 가지고 있습니다.
results_20210503_input003_run017_cluster003.txt
Bash에서 하위 문자열을 재정렬하는 유효한 방법입니까?
results_input003_cluster003_run017_20210503.txt
cut -f$i
을 사용하여 각 필드를 가져온 다음 을 mv
사용하여 파일 이름을 바꾸려고 생각했지만 투박해 보입니다.
답변1
사용펄의 rename
명령줄도구(운영 체제에 따라 또는 라고 rename
불릴 수 있음 ):perl-rename
prename
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
실제로 파일 이름을 바꾸려면 삭제하세요 .