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

Code

はじまり

リサちゃん
リサちゃん

あ〜、ファイルを連番にリネームしたいなあ〜。

135ml
135ml

ほうほう、では今回はそんなことができるスクリプトをBash上で行えるように、しちゃいましょう。

リサちゃん
リサちゃん

あ〜、でもMacでスクショした時のファイル名って、半角スペースが入ってるんだよなあ〜。

135ml
135ml

よし、半角スペースにも対応するようにしちゃいましょう。

リサちゃん
リサちゃん

あ〜、シェルファイルを実行するとなると、いちいちファイルのパスを指定しなきゃいけないから、ワンライナーで実行できたらなあ〜。

135ml
135ml

よし、ファイルを使わずにワンライナーで実行できるようにしちゃいましょう。

リサちゃん
リサちゃん

頼んだ!!!

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

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

command+Shift+3

command+Shift+4

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

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

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

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

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の周りにエスケープしたダブルクォーテーションで括ってあげます。

半角を考慮したコマンド

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

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

変換前

変換後

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

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

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

【シェルスクリプト】IFSで区切り文字(デリミタ)を変更する方法
環境変数IFSについて環境変数「IFS」(Internal Filed Separator)には、bashの場合「スペース」「タブ」「改行」($' \t\n')といった値が初期設定されていて、これらが文字の区切りとして認識されています。ファ

失敗したコマンド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 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

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

おしまい

リサちゃん
リサちゃん

うお〜、どんどんリネームできるぞ〜これ。めっちゃ楽になった!

135ml
135ml

また、よく使う処理があったら、ワンライナーで作ってみますか。

リサちゃん
リサちゃん

頼んだ!!!

以上になります!

コメント

タイトルとURLをコピーしました