え?ファイル名をリネームしたいって?
#そんなの朝飯前。コマンドで一発だよね。
#標準的なリネームコマンド
rename s/aaa/bbb/ ./*
#centosはこう
rename aaa bbb *
$ a.txt bbb.txt kkk.txt
お礼は要らないよ。
#え?先頭に連番がつけたいんだって?い、いいよ?
#ここからechoで確認する。実行するときは | sh を最後につける。
#cat -n で番号を付けてそれを利用する。
ls | cat -n | while read n f ; do echo "mv -n ${f} ${n}_${f}"; done
mv -n a.txt 1_a.txt
mv -n bbb.txt 2_bbb.txt
mv -n kkk.txt 3_kkk.txt
どや?楽勝でしょ。
#え?え?先頭に0で埋めた4桁の数字を付けたかったって?
#printf で桁数指定で出力する。
ls | cat -n | while read n f ; do echo "mv -n ${f} $(printf %04d $n)_${f}"; done;
mv -n 1.txt 0001_1.txt
mv -n 10.txt 0002_10.txt
mv -n 11.txt 0003_11.txt
mv -n 2.txt 0004_2.txt
出来たよ。え?違う?
#1.txtの次は2.txtが自然だって?ああナチュラルソート順ね。
#"える"ではなく"いち",vでバージョンソート,
ls -1vp | cat -n | while read n f ; do echo "mv -n ${f} $(printf %04d $n)_${f}"; done;
mv -n 1.txt 0001_1.txt
mv -n 2.txt 0002_2.txt
mv -n 10.txt 0003_10.txt
mv -n 11.txt 0004_11.txt
mv -n oh my file.txt 0005_oh my file.txt
できたよ?
#え、上手く行かない?ファイル名にスペースが入ってるのね。。
ls -1vp | grep -v "/$" | cat -n | while read n f ; do echo "mv -n '"${f}"' '$(printf %04d $n)_${f}'"; done;
mv -n '1.txt' '0001_1.txt'
mv -n '2.txt' '0002_2.txt'
mv -n '10.txt' '0003_10.txt'
mv -n '11.txt' '0004_11.txt'
mv -n 'oh my file.txt' '0005_oh my file.txt'
これでいいんじゃない?
#え、やっぱり時間順だって?
ls -1ptr | grep -v "/$" | cat -n | while read n f; do echo "mv -n '"${f}"' '"$(printf %04d $n).${f#*.}"'"; done
mv -n '2.txt' '0001.txt'
mv -n '11.txt' '0002.txt'
mv -n '10.txt' '0003.txt'
mv -n '1.txt' '0004.txt'
mv -n 'oh my file.txt' '0005.txt'
ど、どや?
え、自分でやりたい?
#コマンドより安全にリネームできるツールを作ったからそっちを使ってくれー。
はい、ということで、ファイルAPIとjavascriptで作ったリネームツールです。
リネームしたものはZIP圧縮されてダウンロードするので、うっかりコマンド上書きされる心配がないです。
これは nuxt.js で出来ているので、また次回の記事で紹介したいと思いますー。
#おわり
簡単と思ってたら意外と手こずって、スタックオーバーフローを漁ることになり、
それでも中途半端にしか載っていないので、まとめてみました。
ツールを作る羽目にならないように、次はサクッと決めたいですねー。
参考
https://stackoverflow.com/questions/3886295/how-do-i-list-one-filename-per-output-line-in-linux
https://stackoverflow.com/questions/22948042/bash-sort-like-windows-natural-sort-order