Perl과 함께 파일 이름을 쉽게 대량으로 바꾸는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1836563

  •  11-09-2019
  •  | 
  •  

문제

이름을 바꾸려고하는 파일이 많고, 일치하기 위해 정규 표현을 만들려고했지만 파일에 붙어있는 것조차도 다음과 같습니다.

파일 이름 01

파일 이름 100

파일 이름 02

파일 이름 03

기타, 나는 다음과 같이 100 미만의 파일 뒤에 "0"(0)을 추가하고 싶습니다.

파일 이름 001

파일 이름 100

파일 이름 002

파일 이름 003

내가 그들과 일치하는 것만 큼 가장 가까운 것은이 find -type d | 정렬 -r | grep '[1-9] [0-9] $'그러나 나는 그들을 교체하는 방법을 알 수 없었습니다. 저에게 제공 할 수있는 도움에 미리 감사드립니다. 그것이 도움이된다면 Centos에 Im,이 모든 것이 SSH를 통해 이루어지고 있습니다.

도움이 되었습니까?

해결책

perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'

약간 과잉 어쩌면 어쩌면 묻는 일을합니다.

다른 팁

find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e' 

또는 그와 비슷한 것이 제공됩니다

  1. GNU Find 및 Gnu Xargs가 있습니다 (for -print0 그리고 -0)
  2. Perl과 함께 제공되는 '이름 변경'유틸리티가 있습니다.
  3. 파일 이름에는 하나의 숫자 그룹이 있습니다. 하나 이상이 있다면, 당신은 그것을 개혁하려는 숫자와 일치하기 위해 Regex와 함께 무언가를해야합니다.

이것은 일회성입니까? 그렇다면 많은 프로그래머가 경찰로 보일 수있는 것을 제안 할 것입니다.

명령의 출력을 파이프로find -type d | sort -r | grep ' [1-9][0-9]$') 파일에 편집기를 사용하여 글로벌 검색/교체 Magic과 함께 이름을 바꾸는 스크립트를 만듭니다.

그런 다음 스크립트를 버리십시오.

영리한 (그러나 부적절하게 디버깅 된) 하나의 라이너가 파일의 잡초에 들어가서 약간의 시도를 할 가능성은 거의없고 발에 자신을 쏘게 될 가능성은 거의 없습니다.

이 순서대로 두 명령을 실행하십시오.

$ rename 's/File Name (\d)$/File Name 0$1/' *
$ rename 's/File Name (\d\d)$/File Name 0$1/' *

첫 번째는 모든 것을 10 미만으로 이름을 바꾸고 0을 선출합니다. 두 번째는 100 미만의 모든 것을 바꾸고 0을 선출합니다. 결과는 모든 파일 이름에 대해 세 자리가되어야합니다.

Debian에서는 300 개의 파일로 테스트 된 이름 변경과 잘 작동합니다.

 perl -e 'map `touch door$_.txt`, 1..300;'
 rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt

제 생각에는 MMV 여기 당신의 친구입니다.

Perl 또는 Ruby를 사용하여 무언가를 할 수 있습니다.

이 모든 파일을 동일한 디렉토리에 넣으십시오

dirlisting = DIR.entries('.')

dirListing.each do |file| 
 num = file.match(/\d+$/).to_i
 if num < 100
   find the position where start the number, with index and inject the 0 there.
 end
end
use strict;
use File::Copy;

my @files = glob 'File*Name*';

foreach my $filename (@files) {
    if ($filename =~ m`^.*File.*Name.*?(\d+)`) {
        my $number = $1;
        next if ($number > 99);
        rename $filename, sprintf("FileName%03d",$number);
    }
}

리모컨에 배쉬 쉘이있는 경우

for i in File*; 
do 
    case "${i##* }" in  [0-9][0-9] ) 
      echo  mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;; 
    esac; 
done

실제 이름을 변경하려면 "에코"를 제거하십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top