디렉토리의 모든 파일 이름을 특정 형식으로 바꾸는 방법은 무엇입니까? [복사]

디렉토리의 모든 파일 이름을 특정 형식으로 바꾸는 방법은 무엇입니까? [복사]

이 형식의 많은 파일이 포함된 디렉토리가 있습니다. 아래는 내 파일 중 두 가지의 예입니다.

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은 간단히 파일 이름을 바꿀 수 있습니다. 지침. 한 줄의 코드는 기본적이며 경로가 있는 파일 이름을 처리하지 않습니다.

관련 정보