【Bash、Zsh】Macでスクショしたファイル名を連番にワンライナーでリネームする
はじまり






Macでスクリーンショットした時のファイル名
Macでは、ショートカットキー:command+Shift+3や、command+Shift+4でスクリーンショットが取れますよね。
command+Shift+3

command+Shift+4

command+Shift+5

しかし、スクリーンショットを撮った時のファイル名は、デフォルトだとこのように命名されます。半角スペースが入ってしまうのです。これが後でめんどくさいことになります。

なので、今回は、この「スクリーンショット (XXX).png」から、別のファイル名にリネームする処理を、BashおよびZshでやってみたいと思います。
方法その1:半角スペースを考慮しないリネーム
半角スペースを考慮しないリネームは、これになります。
extension='jpg'; prefix='img_'; ls -1v | awk '{ printf "mv %s '$prefix'%03d.'$extension'\n", $0, NR }' | shls -1vで、ファイルを名前順に取得します。
そして、その取得結果をawkに渡してリネームしていきます。
extensionに変更後の拡張子、prefixにファイルのプリフィックス、そして、3桁の連番でファイルをリネームしていきます。
実行するとこんな感じにリネームされます。
変更前

ターミナルで入力

変更後

方法その2:半角スペースを考慮するリネーム
しかしながら、スペースが入っている状態だと、上記の書き方ではリネームできません。こんなエラーが表示されてしまいます。

このエラーが起きる原因は、mvの部分の第1引数の%sに半角スペースが入っているので、上手く引数が認識できていなかったためです。
なので、<code>%sの周りにエスケープしたダブルクォーテーションで括ってあげます。
半角を考慮したコマンド
extension='jpg'; prefix='img_'; ls -1v | awk '{ printf "mv \"%s\" '$prefix'%03d.'$extension'\n", $0, NR }' | shすると、晴れて半角スペース付きのファイルに対しても、リネームすることが出来ました!
変換前

変換後

ちなみに出来なかった書き方その1:IFSをいじる方法
ちなみに、試してみて出来なかった方法も掲載します。
このサイトのように、シェルの環境変数IFSをいじりました。

失敗したコマンド1
OLDIFS=$IFS; IFS=$'\n'; extension='jpg'; prefix='img_'; ls -1v | awk '{ printf "mv %s '$prefix'%03d.'$extension'\n", $0, NR }' | sh; IFS=$OLDIFS;しかし、この方法だと、"mv %s ..."の中は直らないみたいなので、失敗しました。
出力
mv: img_001.jpg is not a directorymv: img_002.jpg is not a directorymv: img_003.jpg is not a directorymv: img_004.jpg is not a directorymv: img_005.jpg is not a directorymv: img_006.jpg is not a directorymv: img_007.jpg is not a directorymv: img_008.jpg is not a directorymv: img_009.jpg is not a directoryちなみに出来なかった書き方その2:awkのFオプションをいじる方法
こちらも出来なかった方法で、awkのところのFオプション値をカンマとかで指定した方法です。
(””で指定すると、実行されるまでもなく「awk: no program given」と怒られるので、何かを指定する必要があります。)
失敗したコマンド2
extension='jpg'; prefix='img_'; ls -1v | awk -F"," '{ printf "mv %s '$prefix'%03d.'$extension'\n", $0, NR }' | shこの書き方でも、同じエラーになります。どうやら、これでも"mv %s ..."の中は直らないみたいです。
出力
mv: img_001.jpg is not a directorymv: img_002.jpg is not a directorymv: img_003.jpg is not a directorymv: img_004.jpg is not a directorymv: img_005.jpg is not a directorymv: img_006.jpg is not a directorymv: img_007.jpg is not a directorymv: img_008.jpg is not a directorymv: img_009.jpg is not a directoryおしまい


以上になります!
記事を共有
この記事が役に立ったなら、ぜひ他の人と共有してください!