답변:
rename
우분투와 함께 제공 되는 도구는 이런 종류의 도구에서 매우 뜨겁습니다. 작은 Perl 표현식을 다음과 같이 포함시킬 수 있습니다.
rename -n 's/.+/our $i; sprintf("AS%d.txt", 1+$i++)/e' *
그것은 단지 당신이 무엇을하는지 보여줄 것입니다. 을 제거하여 -n
산불 운동을하십시오.
이것은 기본적으로 변수를 대략적으로 정의하고 적중 한 각 파일을 증가시켜 작동합니다. 10 개가 넘는 파일을 사용하려는 경우에 0 패딩을 사용하는 것이 좋습니다 sprintf
. 다음은 최고입니다 999
.
rename -n 's/.+/our $i; sprintf("AS%03d.txt", 1+$i++)/e' *
...하지만 확장하기가 쉽습니다.
OLI의 @에 개선하기 위해 대답 의 rename
도구 버전 1.600 에 의해 아리스토텔레스 Pagaltzis은 실제로 내장 카운터가 있습니다 $N
.
필요한 것은
rename 's/AS.*/AS$N/' *
설치하기 위해서,
brew install rename
또는 스크립트를 다운로드/usr/local/bin/brew
또는 /usr/bin
)rename
에 직접 할당 할 수 있습니다 $_
.이 문제에 이상적입니다.우리가 Perl rename
유틸리티에 전달하는 코드 인수는 종종 (와 함께 s/
) 일치 및 대체를 수행 하지만이 방법 으로이 문제 를 해결하는 것은 허용 되지만 실제로 검사하지 않는 경우와 같은 경우에는 실제로 필요하지 않습니다. 이전 파일 이름의 텍스트를 재사용합니다. 당신에 대해 바로 작성할 수 있는 펄 코드, 그리고 그것은 내부에 내장 할 필요가 없습니다 . 다음과 같은 명령을 사용하는 것이 좋습니다.rename
s/
/e
rename -n 'our $i; $_ = sprintf "AS%02d.txt", ++$i' *
또는 몇몇 캐릭터를 면도하고 싶은 경우 :
rename -n '$_ = sprintf "AS%02d.txt", ++our$i' *
(명료성을 희생하지 않으면 서 더 짧게 만들 수는 없었습니다.)
두 명령 모두 같은 일을합니다. 각각은 수행 할 이름 변경 작업을 보여줍니다. 일단 시도해보고 결과에 만족하면 -n
옵션 없이 다시 실행하십시오 . 기록으로,이 파일 이름 생산할 것 AS01.txt
, AS02.txt
, ..., AS10.txt
, AS11.txt
, 등. 필요에 따라 수정 한 다음 -n
원하는 것을 볼 때만 제거 할 수 있습니다.
2보다 큰 너비로 채우려면 2
더 큰 숫자로 바꾸십시오 . 예를 들어 어떤 이유로 파일 이름을 원한다면으로 AS00000000000001.txt
대체 %02d
합니다 %014d
. 패딩을 원하지 않는 경우 (나중에 파일을 나열 할 때 파일이 숫자가 아닌 순서로 표시됨에도 불구하고) 대신 %02d
으로 바꿀 수 있습니다 %d
.
이것은 어떻게 작동합니까? 귀하의 쉘 확장 *
그것도 실행하기 전에 파일의 목록에 rename
명령을. 목록은 현재 로케일 설정에 따라 사전 식 (알파벳순)으로 정렬됩니다. rename
파일 이름을 명령 줄 인수로 받고 나열된 순서대로 처리합니다. 이 표현식 ++$i
은 variable의 현재 값보다 1 큰 것으로 평가 $i
하고 변수 $i
를 새로 증가 된 값으로 설정합니다 . 이 값은에 전달되어 sprintf
형식을 지정하고 다른 텍스트 안에 배치합니다. 이 텍스트는 $_
파일 이름을 보유한 특수 변수에 직접 할당됩니다 . 때문에 rename
그들이 인수로 전달되는 순서대로 파일을 처리, 그들은 그에 따라 번호가 매겨집니다.
둘 다 카운터 변수를 선언하고 증가 sprintf
시키며 , 둘 다 새 파일 이름의 다른 텍스트에서 왼쪽에 0으로 채워진 해당 카운터의 값을 포함하는 본질적으로 동일한 방식으로 사용합니다. (0으로 채우는 방법과 패딩 너비를 변경하는 방법에 대한 정보는 두 가지 모두에 동일하게 적용됩니다.) 너무 유사한 이유는 이전 답변의 방법이 실제로 1 만 수행하기 때문입니다. 많은 문제에는 유용하지만 실제로는 필요하지 않은 추가 단계가 있습니다.
비교를 위해 여기에 사용한 스타일을 사용하도록 수정 한 경우 (그리고 여기서 대신 3 대신 너비 2로 채울 때) 해당 답변의 두 번째 명령이 다음과 같이 표시됩니다.
rename -n 's/.+/our $i; sprintf "AS%02d.txt", ++$i/e' *
해당 명령 사이 s/.+/
와 /e
명령 의 일부 는 이제이 답변의 첫 번째 명령에서 할당 한 표현식 $_
(예 : =
연산자 오른쪽의 코드 )과 동일합니다.
s/
운영자 일치하는 텍스트를 시도 (파일 이름은 쉘에서 확장 것을 *
하고 실행 명령 줄 인수로 전달 rename
)를 가진 정규 표현식 과 치환을 수행한다. 식 /
의 다른 부분을 구분하기 위해 구분 기호로 사용되고 s
있습니다. 첫 번째 부분 .+
은 정규식입니다. 그것은 일치하는 어떤 한 문자 ( .
) , 그리고 그렇게 한 번 이상 ( +
) . 파일 이름이 비어 적이 없기 때문에 - 긴 라고요 항상 적어도 하나 개의 문자 -이 어떤 일치하는 한 가지 방법 (1) 파일 이름.our $i; sprintf "AS%02d.txt", ++$i
. 새 파일 이름이 생성됩니다. 통상적으로, 하나 개를 사용 s/
하나 인 생산 텍스트 (a) 파일 이름, 또는 단지 일부가 유사한 것으로 대체 텍스트 (b) 어떤 방식으로 검색된 텍스트에 기초하여 (예를 들어, 같은 특별한 변수를 사용할 수도 $&
해당 펼쳐 경기). 그러나이 경우 일치하는 텍스트가 전혀 사용되지 않습니다.our $i; sprintf "AS%02d.txt", ++$i
는 파일 이름으로 사용 되며 코드로 실행 되지 않습니다 . 그러나 /e
끝에 있는 플래그는 해당 텍스트를 Perl 소스 코드로 취급하고 평가하며 그렇게함으로써 생성 된 값 (이 경우 Perl 내장 sprintf
함수 의 리턴 값 )을 새 파일 이름으로 사용합니다.여기에 내가 보여준 방법이 와 함께 사용하는 방법 보다이 문제에 대한 명확하고 간단한 접근 방법이라고 생각하지만 , 그 방법을 알고있는 것이 좋습니다. 모든 다른 파일 이름 바꾸기 문제에 적합하기 때문입니다. 또는 원래 파일 이름의 일부가 검사 및 / 또는 유지됩니다. Oli ( 이 답변을 작성한 사람)의 블로그 게시물 을 추천 합니다 . 여기에는 그러한 예제가 포함되어 있습니다.s/
/e
1 기술적으로는,이 인 의 동작의 차이 $_ =
명령 및 s/
/e
명령. 정규 표현식 .+
에서 개행 문자 와 일치하지 않기 때문에 모든 문자 .
와 일치 하는 것은 엄격 하지 않습니다 . 줄 바꿈이 포함 된 파일 이름을 사용해서는 안되지만 실수로 파일 이름이 변경되는 경우도 있습니다. 당신은 기분 경우의 출력을 대조 그에게 . 줄 바꿈 을 일치 시키려면 끝에 있는 플래그 ( )를 사용하십시오. 즉, 대신에 끝에 쓰십시오 .rename -n 'our $i; $_ = sprintf "AS%02d.txt", ++$i' $'foo\nbar'
rename -n 's/.+/our $i; sprintf "AS%02d.txt", ++$i/e' $'foo\nbar'
.
s
e
/se
/e
이름을 바꾸려는 ~/Adir
파일이에 있고이 폴더에있는 유일한 파일 이라고 가정합니다 .
n=0
for f in $( ls ~/Adir | sort ) ; do
n=$(( n+1 ))
mv -n "$f" "AS${n}.txt"
done
이 스크립트는 각 파일을보고 파일이 존재하지 않으면 파일 ~/Adir
이름을 바꿉니다 AS1.txt, AS2.txt, ...
(오버 라이트가 없을 것임). 따라서이 파일이에있는 유일한 파일인지 확인해야합니다 ~/Adir
. 이 sort
명령은 파일이 초기 순서를 유지하기를 원하는 경우에만 사용됩니다.
rename
은 prename입니다. 이 방법이 더 나을 수도 있지만 설치 방법을 추가하여이 답변의 가치를 높이는 것이 좋습니다.