- ファイルをまとめて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
フォルダ名や拡張子の部分は、用途に応じて変更してください。
スクリプトを使うには
- エディタにスクリプトを貼付けて、保存します
(例:move_files.sh
)。 - ターミナルを開き、スクリプトに実行権限を付与します。
(chmod +x move_files.sh
)。 - スクリプトを実行します
(./move_files.sh
)。
こちらもどうぞ。
dittoコマンドの進捗状況を知る【-Vオプション】
dittoコマンドで、ファイルをコピーするときに、時間がかかることがあります。動作中なのか、なにか引っかかってループになっているのかわからないと、途中でターミナルを閉じてよいのか不安です。プログレスバーでも表示できればよいのですが……。とはいえ、簡易的に進捗状況を知るには、-Vオプションで十分かもしれません。 ditto [options] Source Destination_folder -v Print a line of output to stderr for ea...
同じ名前のフォルダをまとめる操作【WindowsとMac】
Macでのフォルダの「結合」は、Windowsでは、どんな用語ですか?Windowsでも、同じ名前のフォルダの中身をまとめることを、「結合(merge)」といいます。◆ こちらの記事の関連同名フォルダの結合Windowsでは、フォルダの移動・コピー先に同名フォルダがあった場合、両方のフォルダの中のファイルが格納されます。この動作は、「結合(merge)」と表示されます。Windowsフォルダーの上書きの確認この宛先には既に 〜 フォルダーが存在します。同じ名前のファイルがある...
[macOS] ファイル名を一括変更するターミナルコマンド(sedでループ)
作業フォルダ内のファイル名にある「@」を「#」まとめて変更する必要がありました。一個ずつファイル名を変更するのは大変なので、シェルスクリプトを作りました。正規表現で作業フォルダ内のファイル名を一括変更する#!/bin/bashcd {作業するフォルダパスを入れます}IFS=$'\n'for f in *; do newname=$(echo "$f" | sed 's/@/#/g') if [[ "$f" != "$newname" ]]; then mv "$f" "$ne...
QRコードを読み込むと、関連記事を確認できます。