'이름 바꾸기'와 'mv'의 차이점은 무엇입니까?


12

그것은 완전히 나에게 분명하지 않다, 그러나의 차이 무엇 mvrename(에서 util-linux-ng 2.17.2와 같은이 /usr/bin/rename)? rename정규 표현식 을 받아들이 는 것 이외의 장점이 mv있습니까? 내가 생각 rename하는 반면, 한 번에 여러 파일 이름 변경을 처리 할 수있는 mv이 작업을 수행하지 않습니다.

나는 그들의 man페이지에서 무엇이 다른지를 구별하거나 내 자신의 조사를 통해 명확한 표시를 찾지 못했습니다 .


2
우리가 똑같은 것에 대해 이야기하고 있는지 확인합시다. 에서 출력 무엇 type -a renamerename --version?
Jeff Schaller

@JeffSchaller이의 더 호기심의 내 부분에,하지만 내 *의 괜찬아 시스템 중 하나에서 내가 얻을 수 rename is /usr/bin/renamerename (util-linux-ng 2.17.2)각각.
Urda

6
거기에있다 가 밖으로 몇 가지 다른 이름 변경은 , 우리는 그것이 무엇을 알고 있는지 난 그냥 확인하고 싶었 그래서, 별칭 / 기능 / 스크립트 수 있었다. 감사합니다! 그 결과를 질문에 자유롭게 편집하십시오.
Jeff Schaller

@JeffSchaller 걱정하지 마십시오. 실제로이 링크 는 방금 rename다른 배포판에서 다른 것을 의미 할 수 있음을 알았습니다 .
Urda

5
귀하의 질문에 답변이있는 것 같습니다. "제트기가 수 있고 수천 배나 빠르게 갈 수 있다는 사실 외에 제트와 세발 자전거의 차이점은 무엇입니까 ?" :-) ⁠
G-Man, 'Reinstate Monica'라고

답변:


21

기본적으로 뚜껑에 표시되어 있습니다.

mv하나 이상의 파일을 지정된 대상 으로 이동 하는 표준 유틸리티 입니다. 이동할 파일이 하나 뿐인 경우 파일 이름을 바꾸는 데 사용할 수 있습니다. 여러 개가 mv있으면 대상이 디렉토리 인 경우에만 작동하며 파일을 그곳으로 이동합니다.

따라서 mv foo bar파일 foo을 디렉토리 로 이동하거나 bar(존재하는 경우) 이름 foo을 바꾸십시오 bar( bar존재하지 않거나 디렉토리가 아닌 경우). mv foo1 foo2 bar두 파일을 모두 directory로 옮기 bar거나 디렉토리 bar가 아닌 경우 불평합니다 .

mvrename()C 라이브러리 함수를 호출하여 파일을 이동하고 작동하지 않으면 (다른 파일 시스템으로 이동중인 경우) 파일을 복사하고 원본을 제거합니다.

모든 것이 mv있고 여러 파일의 이름을 바꾸려면 쉘 루프를 사용해야합니다. 그 여기 사이트에 대한 질문의 숫자가 있습니다, 예를 들어 볼 , , 그리고 다른 사람을 .


반면, 다양한 rename유틸리티는 파일 이름을 개별적으로 바꿉니다 .

renameutil을-리눅스에서 간단한 문자열 대체를하게 언급, 예를 들어이 rename foo bar *변경됩니다 foobarbarbar, 그리고 asdffooasdfbar. 그러나 정규 표현식을 사용 하지는 않습니다 !

Perl 이름 바꾸기 유틸리티 ( 또는 다양한 인스턴스 )는 파일 이름을 변환하기 위해 Perl 표현식을 사용합니다. 패턴 정규식 인 명령을 사용할 가능성이 높습니다 .s/pattern/replacement/

util-linux 이름 바꾸기와 Perl 이름 바꾸기는 파일 이름을 적절히 변경하여 동시에 다른 디렉토리로 파일을 이동시키는 데 사용될 수 있지만 약간 어색합니다. 또한 rename()파일을 호출 하는 것 이상을 수행하지 않으므로 한 파일 시스템에서 다른 파일 시스템으로 이동해도 작동하지 않습니다.

하는 것처럼 rename당신이, 그것은 당신의 분포에 따라 달라질 수 있습니다 , 및 / 또는 당신이 설치되어 있습니다. 대부분은을 지원 rename --version하므로이를 사용하여 어느 것이 있는지 식별하십시오.


'정규 표현'뿐만 아니라 필요할 경우 기능
Gilles Quenot

@GillesQuenot, 예, 예 rename '$_=lc' *를 들어 파일 이름을 소문자로 만들 수 있습니다. 그러나 가장 일반적인 경우는 s///(내가 언급 한) 사용 하는 것이며 패턴 부분은 정규식 이라고 생각합니다 . 나는 당신이 거기에서 기능을 사용할 수 있다고 생각하지 않습니다. 그래도 교체 부품에서 할 수 있습니다.
ilkkachu

@MyWrathAcademia, 맨 페이지의 첫 번째 예는 저에게 효과적입니다 (다른 것과는 다른 방식으로 작동합니다). 또한 내가 데비안 맨 페이지에 링크 한 이유는 최소한 맨 페이지가 rename.ulutil-linux 버전 일 것이고 다른 사람을 위한 것이 아니라는 것이 분명해 졌기 때문 입니다.
ilkkachu

@ilkkachu, 답변이나 의견에 첫 번째 예제에 설명을 추가 하시겠습니까? 이 예제와는 man rename다르므로 데비안 예제에 대한 이해를 아는 것이 좋습니다
MyWrathAcademia

@ MyWrathAcademia, 나는 당신이 rename foo foo0 foo?; rename foo foo0 foo??예제 를 의미한다고 가정했습니다 . 왜냐하면 그것이 내가 본 두 페이지 사이의 유일한 차이점이기 때문입니다. 첫 번째 명령은 각 한 자리 숫자 파일 이름에 0을 추가하고 두 번째 명령은 두 자리 숫자 파일 이름마다 0을 추가하기 때문에 해당 명령 쌍이 작동합니다. 두 번째 세트에는 첫 번째 명령으로 이름이 바뀐 파일이 포함됩니다. rename foo foo00 foo?첫 번째 명령으로도 사용하면 한 번에 두 개의 0이 추가됩니다.
ilkkachu

2

mv파일 이름 만 변경하면됩니다 (다른 파일 시스템이나 경로로 이동할 수도 있음). 이전 이름과 새 이름을 지정하면 파일이 새 이름이나 위치로 변경됩니다. rename대량 이름 변경을 수행하는 데 사용됩니다. 말 당신은, 천개의 파일을 가지고 foo000.log통해 foo999.log당신은 그들 변경을 원 bar000.log통해 bar999.log. 으로 mv당신은해야 할 것 mv foo000.log bar000.log, mv foo001 bar001.log등을하거나 다른 스크립트를 작성합니다. 로 rename간단히 할 rename foo bar foo*.log, 짜잔하고, 천 파일은 순식간에 변경! 정말 멋진. man rename자세한 내용 은 페이지를 다시 확인 하십시오.


2

mv

한 가지 일을하고 잘 수행하도록 설계된 기본 명령 줄입니다 (Unix 철학) : 파일 이동 또는 directorie .

대상 문자열을 해킹 STDOUT& STDIN¹하여 즉시 수정할 수 있지만 스마트 해킹아닙니다.

이름 바꾸기 (펄의 것)

경고 이름이 같은 다른 도구가있을 수도 있고 그렇지 않을 수도 있으므로주의하십시오.

사람들이에 대해 이야기 할 때 rename, 우리는 이것에 대해 생각 ELF합니다.

기본이 아닙니다. Perl입니다. Perl의 일부 기능을 내부에 전달할 수 있으며 매우 강력합니다.

이 예제를 고려하십시오.

당신은 같은 파일의 이름바꾸고 싶습니다

foobar_1.txt
foobar_2.txt
foobar_3.txt

다음과 sprintf()같이 숫자 앞에 0을 붙일 수 있습니다 (regex, heh, Perl : D 사용).

rename 's/(\d+)/sprintf("%04d", $1)/e' foobar_*.txt

이제 당신은 :

foobar_0001.txt
foobar_0002.txt
foobar_0003.txt

실제로 기본 명령이 아닙니까?

은 실제로 dir (s)이동 하도록 설계되지 않았지만 수행 할 수 있습니다.

$ mkdir -p /tmp/foo/bar/base
$ touch /tmp/foo/bar/base/file
$ rename 's!/tmp/foo/bar/base/file!/tmp/file!' /tmp/foo/bar/base/file

이동 된 파일

/tmp/file

¹ *.stackexchange.*웹 사이트에서 볼 수있는 코드

여기에 이미지 설명을 입력하십시오

for FILE in `ls *.txt`
do
    mv ${FILE} `echo ${FILE} | sed 's/anything_ugly/anything_still_ugly/'`
done

가는 길이 아니며, 버그가 많으며, 적절한 순간에 올바른 도구를 사용하는 이유를 설명하기 만합니다.


sprintf이름 바꾸기와 함께 +1
Archemar

-1

mv 는 파일과 디렉토리를 이동하거나 이름을 바꾸고 백업합니다. 이름 바꾸기 는 파일 이름 만 바꿉니다.

mv 에는 더 많은 기능과 옵션이 있습니다. 각 기능에 대한 설명서 페이지에서 스위치를 확인하여 기능의 차이점을 확인하십시오. Ubuntu 18.04LTS에서 man 을 사용하여 살펴 보겠습니다 (마일리지는 각 패키지의 버전에 따라 다를 수 있습니다).

mv 옵션 (도움말 및 버전 생략)

   --backup[=CONTROL]  
          make a backup of each existing destination file  

   -b     like --backup but does not accept an argument  

   -f, --force  
          do not prompt before overwriting  

   -i, --interactive  
          prompt before overwrite  

   -n, --no-clobber  
          do not overwrite an existing file  

  If you specify more than one of -i, -f, -n, only the final one takes effect.  

   --strip-trailing-slashes  
          remove any trailing slashes from each SOURCE argument  

   -S, --suffix=SUFFIX  
          override the usual backup suffix  

   -t, --target-directory=DIRECTORY  
          move all SOURCE arguments into DIRECTORY  

   -T, --no-target-directory  
          treat DEST as a normal file  

   -u, --update  
          move only when the SOURCE file is newer than the destination file or when the destination file is missing  

   -v, --verbose  
          explain what is being done  

   -Z, --context  
          set SELinux security context of destination file to default type  

옵션 이름 바꾸기 (도움말 및 버전 생략)

   -s, --symlink   
          Do not rename a symlink but its target.  

   -v, --verbose  
          Show which files where renamed, if any.  

   -n, --no-act  
          Do not make any changes.  

   -o, --no-overwrite  
          Do not overwrite existing files.            

3
'더 강력한'을 정의하십시오. mv는 이름 바꾸기와 같은 정규 표현식을 지원합니까?
Gilles Quenot

질문자가 말했듯이, 아닙니다.
K7AAY

2
와우, 무슨 논쟁
Gilles Quenot

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