Friday, July 31, 2009

bash で「ある番号以降のファイル」を選択する

cat -n と tail -n + を使ってBashである作成日時以降のファイルをコピーする方法のまとめ。

写真などを撮ると以下のような連番ファイルができることが多々ある。

dscf0007.jpg
dscf0008.jpg
dscf0009.jpg
dscf0010.jpg
...
dscf0199.jpg
dscf0200.jpg
dscf0201.jpg
dscf0202.jpg
dscf0203.jpg
dscf0204.jpg
dscf0205.jpg
dscf0206.jpg
dscf0207.jpg
dscf0208.jpg
dscf0209.jpg
dscf0210.jpg

そしてこの中からある番号以降のファイルを取り出したい場合もまた良くあるが、bashのif文等を使うのは少々面倒に感じていた。最近 cat -n と tail -n + のコマンドを使うことでこの作業が楽になることを発見した。

方法は簡単で


$ ls | cat -n
...
89 dscf0199.jpg
90 dscf0200.jpg
91 dscf0201.jpg
92 dscf0202.jpg
93 dscf0203.jpg
94 dscf0204.jpg
95 dscf0205.jpg
96 dscf0206.jpg
97 dscf0207.jpg
98 dscf0208.jpg
99 dscf0209.jpg
100 dscf0210.jpg

などとし、目的の番号より大きいファイルが何番目以降に出力されるかを調べ
あとは

$ ls | tail -n +

とすれば求める行数以降のファイル名が出力されるのでそれを選択すればよい。
以下はcat -nで89番目以降に表示されるファイルを/dir以下にコピーするコマンドの例。

$ ls | tail -n +89 | xargs -i cp {} /dir


結局はGUIである日付以降のファイルを全部選択するのと同じことをやっているだけなのだけど、CUIでもできるとファイル数がやたら多くなった場合や自動化したい場合に役に立つかもしれない。