![MacOS 터미널(bash/sh/zsh?)을 통해 수백 개의 파일 이름을 변경하여 중복을 포함하여 특정 단어를 바꾸거나 제거합니다.](https://linux55.com/image/193586/MacOS%20%ED%84%B0%EB%AF%B8%EB%84%90(bash%2Fsh%2Fzsh%3F)%EC%9D%84%20%ED%86%B5%ED%95%B4%20%EC%88%98%EB%B0%B1%20%EA%B0%9C%EC%9D%98%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EB%B3%80%EA%B2%BD%ED%95%98%EC%97%AC%20%EC%A4%91%EB%B3%B5%EC%9D%84%20%ED%8F%AC%ED%95%A8%ED%95%98%EC%97%AC%20%ED%8A%B9%EC%A0%95%20%EB%8B%A8%EC%96%B4%EB%A5%BC%20%EB%B0%94%EA%BE%B8%EA%B1%B0%EB%82%98%20%EC%A0%9C%EA%B1%B0%ED%95%A9%EB%8B%88%EB%8B%A4..png)
일반화하다
완전한 문장 제목이 포함된 수천 개의 이미지가 있습니다. 단일 스크립트를 사용하여 자동으로 정리한 다음 더 많은 이미지를 추가할 때 스크립트를 재사용하려고 합니다.
일반적인 아이디어는 잘못된 형식의 그림을 찾은 다음 일련의 이름 바꾸기 및 서식 지정을 통해 처리하는 것입니다.
지금까지 나는 "find", "sed", "rename"과 같은 도구를 사용했고 "mv" 등도 시도해 보았습니다.
필요
다음과 같은 단어를 삭제하세요.in, an, the, on 등은 물론 쉼표, 밑줄 등도 포함됩니다.
파일의 첫 번째 단어 이름을 상위 디렉터리 이름으로 바꿉니다.
(상위 디렉토리) [파일명 명사 동사 태그].jpg.제목의 나머지 단어는 모두 대문자로 작성하세요.
폴더 및 해당 하위 폴더에 대해 이 명령을 실행합니다.
중복 단어 제거
"(상위 폴더)[태그 태그 태그].ext" 형식을 생성합니다.
예: "/path/to/my/files/travel/Denver/[2019년 7월 Sarah Saw Blue Bear].jpg"
예시 프로세스:
- "("로 시작하지 않는 모든 파일 찾기
(만지지 말아야 할 일부 검색 폴더 및 특수 파일을 삭제하십시오)
find /path/to/my/files/travel -not -path '*/\.*' -not -path "*Unsorted*" -not -path "*Tools*" -not -path "*Searches*" -type f \( -not -iname '(*' -not -iname '_*' -not -iname 'Icon*' -not -iname '∆*' \)
결과찾다
- "/path/to/my/files/travel/Denver/Sarah와 저는 2019년 7월에 덴버를 여행하다가 blue bears.jpg를 보았습니다."
- "/path/to/my/files/travel/tampa/tampa 출장, 2018.png"
. . . . 그리고 아직 보지 못한 약 36,000장의 다른 사진도 있습니다.
발견된 파일을 SED와 같은 이름 변경자에게 전달하거나 이름을 바꾸시겠습니까? http://plasmaturm.org/code/이름 바꾸기
rename -v --camelcase -X --trim --subst-all word1 word2 {filename}
이름 바꾸기는 SED의 래퍼일 뿐이라고 생각하지만.. 무엇이든 작동합니다.단어의 일부를 바꾸지 않고 수행해야 하는 모든 잠재적인 이름 바꾸기를 반복합니다.
예를 들어 "the"를 ""로 바꾸더라도 "This"를 "se"로 잘라서는 안 됩니다.
Original Replacement
"The" ""
"In" ""
"Jul " "July"
"Colo Springs" "Colorado Springs"
"Daughter" "Sarah Jones"
" " " "
<-- 이중 공백을 단일 공백으로 변경
"," " "
<-- 쉼표를 공백 등으로 대체합니다.
- 올바른 반복.
Tampa 예에서 이름에 (Tampa)를 추가하면 "(Tampa) Tampa Trip Work 2018.png"가 됩니다.
결과
완료되면 전체 프로세스에서 샘플 파일의 이름이 변경됩니다.
"/path/to/my/files/travel/Denver/2019년 7월 Sarah와 함께 덴버를 여행했고 blue Bears를 보았습니다.jpg"
가 됩니다 ."/path/to/my/files/travel/Denver/(덴버) 2019년 7월 Sarah Saw Blue Bear.jpg"
및"/path/to/my/files/travel/Tampa/Tampa Work Travel, 2018.png"는
다음과 같습니다."/path/to/my/files/travel/Tampa/(탬파) 여행 채용정보 2018.png"
잃어버린 부분들:
- 각 파일에 대한 대체 단어 세트를 전달하고 반복하는 방법을 모르겠습니다.찾다프로세스
- 파일의 상위 디렉터리 이름을 캡처하는 방법을 모르겠습니다.
- 중복을 제거하는 방법을 모르겠습니다
내가 여기서 올바른 길을 가고 있는 걸까?
어떤 도움이라도 대단히 감사하겠습니다.
고쳐 쓰다
나는 이것을 찾았다
https://stackoverflow.com/a/49778528/688243
그래서 저는 이것을 "찾기"에 적용했습니다. 이로써 퍼즐의 일부가 완성되었습니다. 수정해야 할 파일을 찾는 방법을 알아냈습니다.
다음 단계는 "echo"를 대체하여 각 파일의 "이름 바꾸기" 또는 "sed"를 반복하는 것입니다...
IFS=$'\n'
for i in $(find /path/to/my/files/travel -not -path '*/\.*' -not -path "*Unsorted*" -not -path "*Tools*" -not -path "*Searches*" -type f \( -not -iname '(*' -not -iname '_*' -not -iname 'Icon*' -not -iname '∆*' \) );
do
echo "$i"
done
unset IFS
답변1
이것이 최선의 답변인지는 확실하지 않지만 문제를 해결했습니다.
내 "여행" 폴더 이름은 다음과 같습니다.
"this was my sister Jamie's trip to vegas last summer_2019.jpg"
다음으로 이름이 변경되었습니다.
"(Travel) [Sister Jamie Trip Vegas Last Summer 2019].jpg"
이것이 내가 생각해낸 해결책이다:
#!/bin/sh
# # Finds items in the specified folder.
# # Recursively renames them to correct.
# Corrects for whitespace
IFS=$'\n'
# Creates Loop using the results of FIND
for i in $( find /mydrive/pathname -not -path '*/\.*' -not -path "*Unsorted*" -not -path "*Tools*" -not -path "*Searches*" -type f \( -not -iname '(*' -not -iname '_*' -not -iname 'Icon*' \));
do
# Gets the Basename of the file
b="$(basename -- $i)"
# Gets the Parent Folder name
p="$(basename "$(dirname "$i")")"
# Gets the Directory of the file
d="$(dirname "$i")"
## Testing the Variables
# echo "$b"
# echo "$p"
# echo "$d"
# echo "$i"
##
# Change Directory to the file location
cd "$d"/
# Perform Rename actions and iterate the file.
# -X = save the file extension
# -S = replace all occurrences of the word
# -A = Prepend to the filename
# -a = append to the end
# --camelcase = Capitalize Each Word
# The format is -S " OriginalWord " "ReplaceWord" \
rename -X --camelcase \
-S " The " " " \
-S " If " " " \
-S " In " " " \
-S " For " " " \
-S " And " " " \
-S " Of " " " \
-S " A " " " \
-S " Is " " " \
-A "($p) [" \
-a "]" \
-S " ]" "]" \
-S "]]]" "]" \
-S "]]" "]" \
-S "[[[" "[" \
-S "[[" "[" \
-S " (" "(" \
-S "(((" "(" \
-S "((" "(" \
-S ")))" ")" \
-S "))" ")" \
-S "(]" "" \
-S "__" " " \
-S "_" " " \
-S " " " " \
-S " " " " \
-S "..." "." \
-S ".." "." \
-S "'s" "s" \
"$b"
done
# Removes IFS setting
unset IFS
대체를 위한 더 많은 -S 반복이 있지만 온라인에는 몇 가지 예만 올렸습니다.
bash, 이름 바꾸기, Perl의 이름 바꾸기 규칙 등에 대한 광범위한 연구와 도움에 감사드립니다. ㅋ.