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"로 바꿨습니다.
답변1
현재 디렉토리의 파일 이름을 (비재귀적으로) 바꾸려면 (Perl- #
)을 사용할 수 있습니다.somethingelse
이름을 바꿔라유용:
rename 's/#/somethingelse/' *
이와 같은 문자는 -
이스케이프되어야 합니다 \
.
귀하의 경우에는 다음을 사용해야합니다.
rename 's/#U00a9/safe/g' *
특정 파일 선택에서만 작업하려는 경우(예: only ) *.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의 경우 다음 명령을 사용하여 이름 바꾸기를 설치할 수 있습니다.집에서 만든: brew install rename
.
답변2
이것은 어렵지 않습니다. 이름 앞에 백슬래시(\)를 추가하여 이름에서 옥토소프(#)를 이스케이프 처리했는지 확인하세요.
find . -type f -name 'Lucky-*' | while read FILE ; do
newfile="$(echo ${FILE} |sed -e 's/\\#U00a9/safe/')" ;
mv "${FILE}" "${newfile}" ;
done
답변3
파일 목록을 찾아 키워드를 바꿉니다. 아래는 예시입니다
find . -name '*jpg' -exec bash -c ' mv $0 ${0/\#U00a9NBC/safeNBC}' {} \;
답변4
sed에서 사용하는 방법을 모르지만 bash 쉘에서 사용해 볼 수 있습니다.
for f in Lucky-#U00a9NBC-*.jpg; do mv -v "$f" "${f/#U00a9/safe}"; done;
설명하다:
- glob과 일치하는 모든 파일 이름을 반복합니다(Lucky-#U00a9NBC-*.jpg).
- 이동 명령(mv)을 사용하여 파일 이름 바꾸기
- 기본 bash 매개변수 대체 ${var/Pattern/Replacement}를 사용하여 새 이름을 만듭니다("${f/#U00a9/safe}").
매개변수 대체에 대한 추가 정보(제 생각에는 활용도가 매우 낮습니다):http://www.tldp.org/LDP/abs/html/parameter-substitution.html