![디렉토리의 모든 파일 이름을 특정 형식으로 바꾸는 방법은 무엇입니까? [복사]](https://linux55.com/image/103578/%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%ED%8A%B9%EC%A0%95%20%ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
이 형식의 많은 파일이 포함된 디렉토리가 있습니다. 아래는 내 파일 중 두 가지의 예입니다.
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은 간단히 파일 이름을 바꿀 수 있습니다. 지침. 한 줄의 코드는 기본적이며 경로가 있는 파일 이름을 처리하지 않습니다.