【スポンサーリンク】

macOSで画像ファイルを整理(重複避ける移動スクリプト)

macOSで画像ファイルを整理(重複避ける移動スクリプト)
  • ファイルをまとめてmvで移動すると、ファイル名の重複があったときに、うまくいきません。
  • オプションをつけないとmvはエラーでキャンセルされるので上書きはされません。
  • ただ、移動されず残ってしまいます。

macOSのシェルスクリプトで、以下の操作をしたいと思います。

  • フォルダ「Download」にある「.png」「.PNG」「.svg」「.SVG」のファイルすべてをフォルダ「Pictures」に移動したい。
  • ただし、同名ファイルがある場合には、ファイルの末尾に(1)などの数字を追加したい(この数字も重複しないように)。
#!/bin/bash

# 移動元と移動先のフォルダを指定
source_dir=~/Downloads
dest_dir=~/Pictures

# 指定された拡張子のファイルを検索し、それぞれに対して処理
for file in "$source_dir"/*.{png,PNG,svg,SVG}; do
    # ファイルが存在するか確認
    if [[ -f "$file" ]]; then
        # 移動先のファイルパスを生成
        dest_file="$dest_dir/$(basename "$file")"

        # 同名のファイルが存在する場合、連番を付ける
        counter=1
        while [[ -f "$dest_file" ]]; do
            # ファイル名と拡張子を分離
            base="${file##*/}" # 完全なファイル名
            extension="${base##*.}" # 拡張子
            filename="${base%.*}" # ファイル名

            # 連番を付加した新しいファイル名を生成
            new_filename="${filename}(${counter}).${extension}"
            dest_file="$dest_dir/$new_filename"

            # カウンターをインクリメント
            ((counter++))
        done

        # ファイルを移動
        mv "$file" "$dest_file"
        echo "Moved to: $dest_file"
    fi
done

フォルダ名や拡張子の部分は、用途に応じて変更してください。

スクリプトを使うには

  1. エディタにスクリプトを貼付けて、保存します
    (例:move_files.sh)。
  2. ターミナルを開き、スクリプトに実行権限を付与します。
    chmod +x move_files.sh)。
  3. スクリプトを実行します
    ./move_files.sh)。
こちらもどうぞ。
dittoコマンドの進捗状況を知る【-Vオプション】
dittoコマンドの進捗状況を知る【-Vオプション】
dittoコマンドで、ファイルをコピーするときに、時間がかかることがあります。動作中なのか、なにか引っかかってループになっているのかわからないと、途中でターミナルを閉じてよいのか不安です。プログレスバーでも表示できればよいのですが……。とはいえ、簡易的に進捗状況を知るには、-Vオプションで十分かもしれません。 ditto [options] Source Destination_folder -v Print a line of output to stderr for ea...

同じ名前のフォルダをまとめる操作【WindowsとMac】
同じ名前のフォルダをまとめる操作【WindowsとMac】
Macでのフォルダの「結合」は、Windowsでは、どんな用語ですか?Windowsでも、同じ名前のフォルダの中身をまとめることを、「結合(merge)」といいます。◆ こちらの記事の関連同名フォルダの結合Windowsでは、フォルダの移動・コピー先に同名フォルダがあった場合、両方のフォルダの中のファイルが格納されます。この動作は、「結合(merge)」と表示されます。Windowsフォルダーの上書きの確認この宛先には既に 〜 フォルダーが存在します。同じ名前のファイルがある...

[macOS] ファイル名を一括変更するターミナルコマンド(sedでループ)
[macOS] ファイル名を一括変更するターミナルコマンド(sedでループ)
作業フォルダ内のファイル名にある「@」を「#」まとめて変更する必要がありました。一個ずつファイル名を変更するのは大変なので、シェルスクリプトを作りました。正規表現で作業フォルダ内のファイル名を一括変更する#!/bin/bashcd {作業するフォルダパスを入れます}IFS=$'\n'for f in *; do newname=$(echo "$f" | sed 's/@/#/g') if [[ "$f" != "$newname" ]]; then mv "$f" "$ne...
QRコードを読み込むと、関連記事を確認できます。

macOSで画像ファイルを整理(重複避ける移動スクリプト)
【スポンサーリンク】
タイトルとURLをコピーしました