명령 줄에서 여러 파일의 이름을 순차적으로 바꾸는 방법은 무엇입니까?


15

아래와 같이 파일 이름을 바꾸는 방법

AS1100801000002.RAW7AGS 
AS1100801001008.RAW7AH4
AS1100801002001.RAW7AH9
AS1100801003002.RAW7AHE
AS1100801004009.RAW7AHT
AS1100801005002.RAW7AHY
AS1100801010002.RAW7AJ3

새로운 이름으로

AS1.txt
AS2.txt
AS3.txt
AS4.txt
AS5.txt
AS6.txt
AS7.txt

답변:


22

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' *

...하지만 확장하기가 쉽습니다.


4

이 작업을 수행하는 단일 명령 또는 유틸리티는 모르지만 간단한 루프로 수행하기는 쉽습니다.

N=1
for X in AS*RAW*; do
  mv $X AS$N.txt
  N=$(($N+1))
done

3

OLI의 @에 개선하기 위해 대답rename도구 버전 1.600 에 의해 아리스토텔레스 Pagaltzis은 실제로 내장 카운터가 있습니다 $N.

필요한 것은

rename 's/AS.*/AS$N/' *

설치하기 위해서,

  1. brew install rename또는 스크립트를 다운로드
  2. 시스템 경로의 디렉토리에 저장하십시오 (보통 /usr/local/bin/brew또는 /usr/bin)

3
이것은 같은 이름을 가진 다른 도구 인 것 같습니다. 우분투의 기본값 rename은 prename입니다. 이 방법이 더 나을 수도 있지만 설치 방법을 추가하여이 답변의 가치를 높이는 것이 좋습니다.
Oli

1
@Oli 좋은 전화! 업데이트되었습니다.
Atav32

2

rename에 직접 할당 할 수 있습니다 $_.이 문제에 이상적입니다.

우리가 Perl rename유틸리티에 전달하는 코드 인수는 종종 (와 함께 s/) 일치 및 대체를 수행 하지만이 방법 으로이 문제해결하는 것은 허용 되지만 실제로 검사하지 않는 경우와 같은 경우에는 실제로 필요하지 않습니다. 이전 파일 이름의 텍스트를 재사용합니다. 당신에 대해 바로 작성할 수 있는 펄 코드, 그리고 그것은 내부에 내장 할 필요가 없습니다 . 다음과 같은 명령을 사용하는 것이 좋습니다.renames/ /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그들이 인수로 전달되는 순서대로 파일을 처리, 그들은 그에 따라 번호가 매겨집니다.


Oli의 답변 과 유사하다는 것을 알았을 것입니다 !

둘 다 카운터 변수를 선언하고 증가 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'.se/se/e


0

이름을 바꾸려는 ~/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명령은 파일이 초기 순서를 유지하기를 원하는 경우에만 사용됩니다.


0

OP에는 명령 줄 옵션이 필요하지만 노틸러스에서는 GUI 옵션으로도 사용할 수 있으며 매우 쉽습니다.

필요한 파일을 모두 선택하고 F2를 누르십시오. 자동 번호라는 옵션이 있습니다. 필요한 텍스트에 추가 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.