MacOS ターミナル (bash/sh/zsh?) で何百ものファイル名を変更し、重複を含む特定の単語を変更または削除します。

MacOS ターミナル (bash/sh/zsh?) で何百ものファイル名を変更し、重複を含む特定の単語を変更または削除します。

一般化する

完全な文章のタイトルを含む何千もの画像があります。単一のスクリプトを使用して自動的にクリーンアップし、さらに画像を追加するときにスクリプトを再利用しようとしています。

一般的なアイデアは、間違った形式の画像を見つけて、一連の名前変更と書式設定で処理することです。

これまでは、「find」、「sed」、「rename」などのツールを使用しており、「mv」なども試してみました。

必要

  1. 次の単語を削除してください。in、an、the、onなどはもちろん、カンマ、アンダースコアなども含まれます。

  2. ファイルの最初の単語名を親ディレクトリ名に変更します。
    (親ディレクトリ)[ファイル名名詞動詞タグ].jpg。

  3. タイトルの残りの単語はすべて大文字で書いてください。

  4. フォルダとそのサブフォルダに対してこのコマンドを実行します。

  5. 重複する単語を削除

  6. 「(親フォルダ)[タグタグタグ].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/Sarahと私は2019年7月にデンバーを旅行した後、blue bears.jpgを見ました。」
  • "/path/to/my/files/travel/tampa/tampa 出張、2018.png"
    。 。 。 。そしてまだ見ていない約36,000枚の他の写真もあります。
  1. 見つかったファイルをSEDなどの名前変更者に渡すか、名前を変更しますか? http://plasmaturm.org/code/名前の変更
    rename -v --camelcase -X --trim --subst-all word1 word2 {filename}
    名前変更はSEDのラッパーだけだと思いますが..何でも動作します。

  2. 単語の一部を変更せずに実行する必要があるすべての潜在的な名前変更を繰り返します。
    たとえば、「the」を「」に置き換えても、「This」を「se」に切り捨ててはいけません。

Original Replacement
"The" ""
"In" ""
"Jul " "July"
"Colo Springs" "Colorado Springs"
"Daughter" "Sarah Jones"
" " " " <-- 二重スペースを単一のスペースに変更
"," " " <-- カンマをスペースなどに置き換えます。

  1. 正しい繰り返し。
    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の名前変更規則などの広範な研究と助けに感謝します。笑。

おすすめ記事