이 형식의 많은 파일이 포함된 디렉토리가 있습니다. 아래는 내 파일 중 두 가지의 예입니다.
file_948_of_2000_push_data_12345.log
file_950_of_2000_push_data_12345.log
보시다시피 유일한 차이점은 파일 번호 948
와 입니다 950
. 이제 이 특정 형식으로 모든 파일의 이름을 바꾸고 싶습니다.
files_948.log
files_950.log
내가 할 수 있는 가장 좋은 방법은 무엇입니까?
답변1
쉘 매개변수 확장 사용
$ for f in *.log; do g="${f/#file_/}"; echo mv -- "$f" "files_${g%%_*}.log"; done
mv -- file_948_of_2000_push_data_12345.log files_948.log
mv -- file_950_of_2000_push_data_12345.log files_950.log
Perl 기반 prename
또는 rename
명령을 사용하십시오.
$ prename -n -- 's/^(.*?)_(.*?)_.*\.log$/$1s_$2.log/' *.log
file_948_of_2000_push_data_12345.log renamed as files_948.log
file_950_of_2000_push_data_12345.log renamed as files_950.log
사용mmv
$ mmv -n '*_*_*.log' '#1s_#2.log'
file_948_of_2000_push_data_12345.log -> files_948.log
file_950_of_2000_push_data_12345.log -> files_950.log
필요에 따라 삭제하거나 -n
.echo
답변2
다음 명령을 시도해 볼 수 있습니다.
ls -C1 file*log | perl -ane 'chomp;$d=$_; s/^(\w+?)_(\d+?)_.*/$1s_$2.log/; print "mv -v $d $_\n";' | bash
Perl 스크립트는 이동 명령을 생성합니다. bash의 파이프를 닫고 명령이 원하는 대로 작동하는지 확인하세요. 표준 입력에서 파일 목록을 읽고 첫 번째 단어, 밑줄, 숫자 집합을 일치시킨 다음 move 명령을 인쇄하는 Perl 단일 행입니다. Linux 외부의 다른 응용 프로그램에 필요한 경우 Perl은 간단히 파일 이름을 바꿀 수 있습니다. 지침. 한 줄의 코드는 기본적이며 경로가 있는 파일 이름을 처리하지 않습니다.