通过 MacOS 终端(bash/sh/zsh?)重命名数百个文件名以替换或删除特定单词,包括重复的单词

通过 MacOS 终端(bash/sh/zsh?)重命名数百个文件名以替换或删除特定单词,包括重复的单词

概括

我有数千张以完整句子为标题的图片。我正尝试使用单个脚本自动清理它们,然后在添加更多图片时重复使用该脚本。

总体思路是找到格式错误的图片,然后通过一组重命名和格式化对其进行处理。

到目前为止,我已经使用过“查找”、“SED”和“重命名”等工具,甚至尝试过“mv”等......

需求

  1. 删除类似这样的词in、an、the、on 等以及逗号、下划线等。

  2. 将文件中的第一个单词重命名为父目录名称:
    (父目录)[文件名名词动词标签].jpg。

  3. 标题大写剩下的每个字。

  4. 针对文件夹及其子文件夹运行此命令。

  5. 删除重复的单词

  6. 创建“(父文件夹)[Tag Tag Tag].ext”的格式
    例如:“/path/to/my/files/travel/Denver/(丹佛) [2019 年 7 月 Sarah Saw Blue Bear].jpg”

示例流程:

  1. 查找所有不以“(”开头的文件
    (删除一些不应该触及的搜索文件夹和特殊文件)

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 张我尚未浏览过的其他照片。
  1. 将这些找到的文件传递给重命名器,例如 SED 或重命名? http://plasmaturm.org/code/rename
    rename -v --camelcase -X --trim --subst-all word1 word2 {filename}
    我怀疑重命名只是 SED 的包装,但是..无论有效

  2. 迭代所有需要进行的潜在重命名,而不替换单词的部分内容。
    例如,将“the”替换为“”不应将“These”修剪为“se”

Original Replacement
"The" ""
"In" ""
"Jul " "July"
"Colo Springs" "Colorado Springs"
"Daughter" "Sarah Jones"
" " " " <-- 双空格改为单空格
"," " " <-- 将逗号替换为空格等。

  1. 正确的重复。
    在坦帕的示例中,只需将 (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 的重命名约定等的大量研究。哈哈。

相关内容