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

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

はじまり#

リサちゃん avatar
リサちゃん
あ〜、ファイルを連番にリネームしたいなあ〜。
135ml avatar
135ml
ほうほう、では今回はそんなことができるスクリプトをBash上で行えるように、しちゃいましょう。
リサちゃん avatar
リサちゃん
あ〜、でもMacでスクショした時のファイル名って、半角スペースが入ってるんだよなあ〜。
135ml avatar
135ml
よし、半角スペースにも対応するようにしちゃいましょう。
リサちゃん avatar
リサちゃん
あ〜、シェルファイルを実行するとなると、いちいちファイルのパスを指定しなきゃいけないから、ワンライナーで実行できたらなあ〜。
135ml avatar
135ml
よし、ファイルを使わずにワンライナーで実行できるようにしちゃいましょう。

Macでスクリーンショットした時のファイル名#

Macでは、ショートカットキー:command+Shift+3や、command+Shift+4でスクリーンショットが取れますよね。

command+Shift+3

command+Shift+4

command+Shift+5

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

なので、今回は、この「スクリーンショット (XXX).png」から、別のファイル名にリネームする処理を、BashおよびZshでやってみたいと思います。

方法その1:半角スペースを考慮しないリネーム#

半角スペースを考慮しないリネームは、これになります。

Terminal window
extension='jpg'; prefix='img_'; ls -1v | awk '{ printf "mv %s '$prefix'%03d.'$extension'\n", $0, NR }' | sh

ls -1vで、ファイルを名前順に取得します。

そして、その取得結果をawkに渡してリネームしていきます。 extensionに変更後の拡張子、prefixにファイルのプリフィックス、そして、3桁の連番でファイルをリネームしていきます。

実行するとこんな感じにリネームされます。

変更前

ターミナルで入力

変更後

方法その2:半角スペースを考慮するリネーム#

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

このエラーが起きる原因は、mvの部分の第1引数の%sに半角スペースが入っているので、上手く引数が認識できていなかったためです。

なので、<code>%sの周りにエスケープしたダブルクォーテーションで括ってあげます。

半角を考慮したコマンド

Terminal window
extension='jpg'; prefix='img_'; ls -1v | awk '{ printf "mv \"%s\" '$prefix'%03d.'$extension'\n", $0, NR }' | sh

すると、晴れて半角スペース付きのファイルに対しても、リネームすることが出来ました!

変換前

変換後

ちなみに出来なかった書き方その1:IFSをいじる方法#

ちなみに、試してみて出来なかった方法も掲載します。

このサイトのように、シェルの環境変数IFSをいじりました。

失敗したコマンド1

Terminal window
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 directory
mv: img_002.jpg is not a directory
mv: img_003.jpg is not a directory
mv: img_004.jpg is not a directory
mv: img_005.jpg is not a directory
mv: img_006.jpg is not a directory
mv: img_007.jpg is not a directory
mv: img_008.jpg is not a directory
mv: img_009.jpg is not a directory

ちなみに出来なかった書き方その2:awkのFオプションをいじる方法#

こちらも出来なかった方法で、awkのところのFオプション値をカンマとかで指定した方法です。 (””で指定すると、実行されるまでもなく「awk: no program given」と怒られるので、何かを指定する必要があります。)

失敗したコマンド2

Terminal window
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 directory
mv: img_002.jpg is not a directory
mv: img_003.jpg is not a directory
mv: img_004.jpg is not a directory
mv: img_005.jpg is not a directory
mv: img_006.jpg is not a directory
mv: img_007.jpg is not a directory
mv: img_008.jpg is not a directory
mv: img_009.jpg is not a directory

おしまい#

リサちゃん avatar
リサちゃん
うお〜、どんどんリネームできるぞ〜これ。めっちゃ楽になった!
135ml avatar
135ml
また、よく使う処理があったら、ワンライナーで作ってみますか。

以上になります!

記事を共有

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

【Bash、Zsh】Macでスクショしたファイル名を連番にワンライナーでリネームする
https://endorphinbath.com/posts/bash-mac-rename-screenshot/
著者
kinkinbeer135ml
公開日
2022-04-18
ライセンス
CC BY-NC-SA 4.0
関連記事 スマート
1
【画像編集】Pixelmator Pro内で選択した画像を斜めに切り抜く方法
Software UIが取っ付きにくいPixelmator Proですが、画像を斜めに切り取れる方法を見つけましたので紹介します。
2
【Cloud Scheduler】コンテナを動かすために必要なgcloudコマンドをシェル関数化する
Code Google Cloud上でデプロイされたコンテナを操作するためにシェル関数を構築します。その関数には処理が完了した時やエラー発生時に通知を行ったりヘルプ機能も実装します。
3
【Cloud Run】コンテナを稼働させるまでに必要なgcloudコマンドをシェル関数化する
Code Google Cloud上でコンテナをデプロイするためにシェル関数を構築します。その関数には処理が完了した時やエラー発生時に通知を行ったりヘルプ機能も実装します。
4
【ガジェット、Mac】7年ぶりにMacを買うから、2013年のMacBook Proと2021年のMacBook Proを比べてみた。
Hardware 7年ぶりにMacを新調するので、2013年のMacBook Proと2021年のMacBook Proを比べて、どれだけ性能・仕様に違いがあるのかを調べてみました。流石に7年も違うとなると、全然違う・・・!?
5
【Python】venvを使いながら環境変数PS1を設定してプロンプトを見やすくしたい
Code Python開発時のvirtualenvの有効化時に、Bashの環境変数「PS1」でターミナルのプロンプトが白色に戻ってしまう事象を直すための方法を紹介します。
ランダム記事 ランダム
Profile Image of the Author
kinkinbeer135ml
SIerをやめて、プログラミングを勉強しています。※Amazonアソシエイトに参加しています。
お知らせ
私のブログへようこそ!これはサンプルのお知らせです。
音楽
カバー

音楽

再生中なし

0:00 0:00
歌詞なし
カテゴリ
タグ
サイト統計
記事
287
カテゴリー
8
タグ
93
総文字数
486,174
運用日数
0
最終活動
0 日前

目次