はじまり

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

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

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

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

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

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

頼んだ!!!
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
をいじりました。

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

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

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

頼んだ!!!
以上になります!
コメント