파일 이름에서 문자열을 바꾸어 여러 파일의 이름을 바꾸는 방법은 무엇입니까? 이 문자열은“#”을 포함합니다


42

https://serverfault.com/questions/70939/how-to-replace-a-text-string-in-multiple-files-in-linux

https://serverfault.com/questions/228733/how-to-rename-multiple-files-by-replacing-word-in-file-name

https://serverfault.com/questions/212153/replace-string-in-files-with-certain-file-extension

https://serverfault.com/questions/33158/searching-a-number-of-files-for-a-string-in-linux

이 기사들은 모두 내 질문에 대답했습니다. 그러나 그들 중 누구도 나를 위해 일하지 않습니다. 교체하려는 문자열에 #이 있기 때문에 이것이 의심됩니다. 이것을 해결하는 특별한 방법이 있습니까?

사이트 마이그레이션 중에 é가 # U00a9로 대체 된 이미지 파일이 있습니다. 이것들은 다음과 같습니다 :

Lucky-#U00a9NBC-80x60.jpg
Lucky-#U00a9NBC-125x125.jpg
Lucky-#U00a9NBC-150x150.jpg
Lucky-#U00a9NBC-250x250.jpg
Lucky-#U00a9NBC-282x232.jpg
Lucky-#U00a9NBC-300x150.jpg
Lucky-#U00a9NBC-300x200.jpg
Lucky-#U00a9NBC-300x250.jpg
Lucky-#U00a9NBC-360x240.jpg
Lucky-#U00a9NBC-400x250.jpg
Lucky-#U00a9NBC-430x270.jpg
Lucky-#U00a9NBC-480x240.jpg
Lucky-#U00a9NBC-600x240.jpg
Lucky-#U00a9NBC-600x250.jpg
Lucky-#U00a9NBC.jpg

나는 이것을 다음과 같이 바꾸고 싶다 :

Lucky-safeNBC-80x60.jpg
Lucky-safeNBC-125x125.jpg
Lucky-safeNBC-150x150.jpg
Lucky-safeNBC-250x250.jpg
Lucky-safeNBC-282x232.jpg
Lucky-safeNBC-300x150.jpg
Lucky-safeNBC-300x200.jpg
Lucky-safeNBC-300x250.jpg
Lucky-safeNBC-360x240.jpg
Lucky-safeNBC-400x250.jpg
Lucky-safeNBC-430x270.jpg
Lucky-safeNBC-480x240.jpg
Lucky-safeNBC-600x240.jpg
Lucky-safeNBC-600x250.jpg
Lucky-safeNBC.jpg

최신 정보:

이 예제는 모두 "LU00a9ucky로 시작하지만 여기에는 이름이 다른 많은 이미지가 있습니다. 문자열의"# U00a9 "부분을"safe "로 대체하기 만하면됩니다.


3
실제로 무엇을 시도 했습니까? 몇 가지 질문에 연결하여 실패했다고 말했지만 어떻게 실패 했습니까? 가장 좋은 예인 IMO는 rename명령을 사용합니다 . 귀하의 이름 변경이 간단한 것 같습니다 rename -n 's/#/safeNBC/' *.jpg.
Zoredache

시도했지만 rename -n 's/#U00a9/safe/' *.jpg명령이 수락되었지만 변경 사항이 발생하지 않았습니다.

반드시 검토 한 문서에서 보았 듯이 옵션 -nno act옵션입니다. 실제로 사용하기 전에 작동하는지 확인할 수 있습니다. 화면 출력에 잠재적 인 새 이름이 올바르게 표시 되었습니까?
Zoredache

주의를 기울이지 않고 예제를 복사하여 붙여 넣은 것에 대해 사과드립니다. -n없이 이름 바꾸기 명령을 수행했습니다. @DTK가 문제를 해결한다고 생각하지만 #을 피하지 못했습니다.

맥 OS에서 파일 이름에 문자열을 교체 : superuser.com/questions/152627/...
안톤 타라 센코

답변:


64

교체하기 #somethingelse현재 디렉토리 (재귀되지 않음) 당신이 사용할 수있는 파일 이름을 GNU 이름 바꾸기 유틸리티를 :

rename  's/#/somethingelse/' *

와 같은 문자 -는로 이스케이프해야합니다 \.

귀하의 경우에는

rename 's/#U00a9/safe/g' *

특정 파일 선택 (예 : 만)에서만 작업 *.jpg하려면 해당 선택과 일치하도록 최종 입력을 조정하십시오.

rename 's/#U00a9/safe/g' *.jpg

실제로 파일 이름을 변경하기 전에 테스트를 수행하려면 -n플래그를 사용하십시오 .

demo/> ls                               
Lucky-#U00a9NBC-125x125.jpg  
Lucky-#U00a9NBC-150x150.jpg 

demo/> rename -n 's/#U00a9/safe/g' *.jpg
rename(Lucky-#U00a9NBC-125x125.jpg, Lucky-safeNBC-125x125.jpg)
rename(Lucky-#U00a9NBC-150x150.jpg, Lucky-safeNBC-150x150.jpg)

OS X의 경우, GNU 이름 변경을 사용하여 설치할 수 있습니다 사제를 : brew install rename.


이것은 내 컴퓨터 (Arch Linux)에서 작동하지 않지만 mik의 대답은 작동했습니다.
marcvangend

@marcvangend 어떤 버전 rename을 사용하고 있습니까? # sudo pacman -S perl-rename더 강력하고이 답변이 효과가있을 수있는 perl 버전을 설치합니다.
John Gowers 17 년

@JohnGowers 감사합니다! 두 가지 버전이 있다는 것을 몰랐습니다. 내 시스템에서는 실제로 펄 버전이 아닌 것을 rename --version반환합니다 rename from util-linux 2.29.2.
marcvangend 21:53에

5
두 가지 공통 rename유틸리티가 있지만 GNU에서 개발 한 것은 없습니다. 데비안 기반 배포판에는 renamePerl 패키지가 포함 된 유틸리티가 포함되어 있으며 Red Hat 기반 배포판 은 Linux Kernel Organization 의 rename유틸리티를 사용합니다 util-linux. 귀하의 링크는 GNU 표준 라이브러리에서 renameC 함수로 연결됩니다 .
Anthony G-Monica에 대한 정의

2
이 답변에서, 우리는 왜 작성해야합니까 /g에서rename 's/#U00a9/safe/g' *
Nikhil

21

파일 목록을 찾은 다음 키워드를 바꿉니다. 아래는 예입니다

find . -name '*jpg' -exec bash -c ' mv $0 ${0/\#U00a9NBC/safeNBC}' {} \;

1
당신은 당신의 주위에 몇 가지 큰 따옴표 필요한 mv경우 이름에 공백이 인수를
중지에 지장을주지 모니카

모든 파일 * _spec.rb를 * _controller_spec.rb로 바꿔야했고 솔루션이 나를 위해 일했습니다. 고맙습니다.
jedi

18

이것은 어렵지 않습니다. 역 슬래시 (\)를 앞에 붙여서 이름에서 옥토 프 (#)를 이스케이프 처리하십시오.

find . -type f -name 'Lucky-*' | while read FILE ; do
    newfile="$(echo ${FILE} |sed -e 's/\\#U00a9/safe/')" ;
    mv "${FILE}" "${newfile}" ;
done 

당신의 설명은 #내가 원하는 것처럼 소리를 피하는 것이 합리적 입니다. 귀하의 예에서 백 슬래시가 보이지 않습니다. 다음과 같이 보일 것입니다 : s/\#U00a9/safe/

@LeonFrancisShelhamer 좋은 캐치. 백 슬래시를 삼켰습니다. 수정하겠습니다.

17

#쉘에서 빠져 나오려면 작은 따옴표 ( '#'), 큰 따옴표 ( "#") 또는 백 슬래시 ( \#)를 사용하십시오.

귀하의 경우 가장 간단한 방법은 rename명령 을 사용하는 것입니다 (사용 가능한 경우).

rename '#U00a9' safe *.jpg

2
감사. 가장 높은 투표 응답 ( rename 's/#/somethingelse/' *)이 내 컴퓨터 (Arch Linux)에서 작동하지 않았지만이 작업은 수행되었습니다.
marcvangend

1
이것은 util-linux에서 rename 명령을 사용하여 작동합니다.
부정

10

sed에서 방법을 모르지만 bash 쉘에서 시도해 볼 수 있습니다.

for f in Lucky-#U00a9NBC-*.jpg; do mv -v "$f" "${f/#U00a9/safe}"; done;

설명:

  1. glob와 일치하는 모든 파일 이름을 반복합니다 (Lucky- # U00a9NBC-*. jpg)
  2. 이동 명령을 사용하여 파일 이름을 바꿉니다 (mv)
  3. 기본 bash 매개 변수 대체 $ {var / Pattern / Replacement}를 사용하여 새 이름을 작성합니다 ( "$ {f / # U00a9 / safe}")

매개 변수 대체에 대한 자세한 내용 (이용률이 낮은 IMO) : http://www.tldp.org/LDP/abs/html/parameter-substitution.html


이 코드는 질문에 대답 할 수 있지만 그다지 유용하지는 않습니다. 문제 해결 방법 을 설명 하면 답변의 유용성과 장기적인 가치가 향상됩니다.
Anthony G-Monica에 대한 정의

Anthony의 의견에 따라 연습 설명과 추가 자료를 추가했습니다.
Gregory Patmore

1

위의 예제는 내 시스템 (CentOS 5.6)에서 작동하지 않았으므로 작동하는 (더 많은 시스템 특정) 명령을 찾았습니다 (참고 : \명령 줄에서 '#'을 이스케이프해야 함 ).

rename \#U00a9 safe *.jpg

[또한 : 나는의 사용에 대한 그래서 Nikhil의 질문에 대한 응답으로, 코멘트에 아직 충분한 명성을하지 않아도 /g에서 rename 's/old_string/new_string/g'(다른 답변 위의 의견에 제기) :

g수정자를 사용하여 '전역'대체를 수행 하십시오 (즉, old_string이 발생하는 횟수만큼 old_string을 new_string으로 대체). 로 rename지정된 모든 파일에 적용 되기 때문에 내 대답에는 필요하지 않습니다 *. 이에 대한 간략한 설명은 https://www.computerhope.com/unix/rename.htm 을 참조 하십시오 .]


옳은; CentOS와 같은 Fedora 파생 OS rename는 Debian 파생 OS와 버전이 다릅니다 . unix.stackexchange.com/a/238862/135943을 참조하십시오 . 그건 그렇고, CentOS 5.6은 상당히 오래되었으므로 업그레이드하는 것이 좋습니다.
와일드 카드

아, 설명 + 링크 주셔서 감사합니다. 구식 OS가 작동 중이므로 업그레이드하는 것은 나에게 달려 있지 않습니다.) 그러나 새로운 클러스터가 구축되고 있으며 아마도 우리가 넘어갈 때 업그레이드 할 것입니다.
Ezra Citron

0

재사용 가능한 bash 함수로 싸인 DTK 솔루션은 다음과 같습니다.

function renameFilesRecursively () {

  SEARCH_PATH="$1"
  SEARCH="$2"
  REPLACE="$3"

  find ${SEARCH_PATH} -type f -name "*${SEARCH}*" | while read FILENAME ; do
      NEW_FILENAME="$(echo ${FILENAME} | sed -e "s/${SEARCH}/${REPLACE}/g")";
      mv "${FILENAME}" "${NEW_FILENAME}";
  done

}

사용 방법은 다음과 같습니다.

renameFilesRecursively /home/user/my-files apple orange

0

실제로 rename는 전화를 걸 --subst거나 -s간단히 선택할 수 있습니다. 정규식 구문을 사용할 필요가 없습니다.

rename -s '#U00a9' 'safe' *

다중 발생을 대체 / 대체하려면 --subst-all또는을 사용하십시오 -S.

BTW, 문자열 만 바꾸고 싶었습니다 (파일 이름에서 제거하십시오 ...) 물론 우리는 그것에 대한 옵션 -d/--delete-D/--delete-all:

rename -d '#U00a9' *

-1

또 다른 옵션은 pyRenamer배치 이름 바꾸기를 위해 특별히 만들어진 응용 프로그램 을 사용 하는 것입니다.

함께 설치할 수 있습니다 sudo apt-get install pyrenamer

사용법에 대한 자세한 내용 은 GitHub의 README 파일을 참조하십시오 .


1
이것이 질문에 대한 답변이 될 수 있다고 생각되면 답변에 설명을 추가하십시오. 그 자체로는 패키지 만 설치합니다. 명령의 기능을 설명하고 OP의 특정 요구 사항을 처리하는 예를 제공해야합니다.
roaima
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.