![通过 MacOS 终端(bash/sh/zsh?)重命名数百个文件名以替换或删除特定单词,包括重复的单词](https://linux22.com/image/193586/%E9%80%9A%E8%BF%87%20MacOS%20%E7%BB%88%E7%AB%AF%EF%BC%88bash%2Fsh%2Fzsh%EF%BC%9F%EF%BC%89%E9%87%8D%E5%91%BD%E5%90%8D%E6%95%B0%E7%99%BE%E4%B8%AA%E6%96%87%E4%BB%B6%E5%90%8D%E4%BB%A5%E6%9B%BF%E6%8D%A2%E6%88%96%E5%88%A0%E9%99%A4%E7%89%B9%E5%AE%9A%E5%8D%95%E8%AF%8D%EF%BC%8C%E5%8C%85%E6%8B%AC%E9%87%8D%E5%A4%8D%E7%9A%84%E5%8D%95%E8%AF%8D.png)
概括
我有数千张以完整句子为标题的图片。我正尝试使用单个脚本自动清理它们,然后在添加更多图片时重复使用该脚本。
总体思路是找到格式错误的图片,然后通过一组重命名和格式化对其进行处理。
到目前为止,我已经使用过“查找”、“SED”和“重命名”等工具,甚至尝试过“mv”等......
需求
删除类似这样的词in、an、the、on 等以及逗号、下划线等。
将文件中的第一个单词重命名为父目录名称:
(父目录)[文件名名词动词标签].jpg。标题大写剩下的每个字。
针对文件夹及其子文件夹运行此命令。
删除重复的单词
创建“(父文件夹)[Tag Tag Tag].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/2019 年 7 月我和莎拉一起去丹佛旅行并看到了蓝熊.jpg”
- “/path/to/my/files/travel/坦帕/坦帕工作旅行,2018.png”
。 。 。 。以及大约 36000 张我尚未浏览过的其他照片。
将这些找到的文件传递给重命名器,例如 SED 或重命名? http://plasmaturm.org/code/rename
rename -v --camelcase -X --trim --subst-all word1 word2 {filename}
我怀疑重命名只是 SED 的包装,但是..无论有效迭代所有需要进行的潜在重命名,而不替换单词的部分内容。
例如,将“the”替换为“”不应将“These”修剪为“se”
Original Replacement
"The" ""
"In" ""
"Jul " "July"
"Colo Springs" "Colorado Springs"
"Daughter" "Sarah Jones"
" " " "
<-- 双空格改为单空格
"," " "
<-- 将逗号替换为空格等。
- 正确的重复。
在坦帕的示例中,只需将 (Tampa) 添加到名称中就会生成“(Tampa) Tampa Trip Work 2018.png”
结果
完成后,整个过程将重命名我们的示例文件:
“/path/to/my/files/travel/Denver/2019 年 7 月与 Sarah 一起去丹佛旅行并看到了蓝熊.jpg”
变为“/path/to/my/files/travel/Denver/(Denver) July 2019 Sarah Saw Blue Bear.jpg”
和“/path/to/my/files/travel/Tampa/Tampa 工作旅行,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、rename、perl 的重命名约定等的大量研究。哈哈。