本記事では、指定したディレクトリとその子ディレクトリ以下に存在する、とあるファイルたちに対して同じ操作をするための方法をまとめる。
状況説明
どのような状況でこういった操作が必要となるか?例えば、手持ちのjpegファイルを別の場所にひとまとめにする場合である。次のような状況だとちょっと作業が大変そうに思われる。
基点になるディレクトリとして~/picturesを使っていて、その下に種類や撮影場所ごとにディレクトリを作成してjpegファイルを格納してある場合。さらに、テキストファイルなど別の種類のファイルも格納してある場合。
解決法
簡単に解決する方法としてファイルグラブを使う方法が考えられる。~/picturesの下にあるディレクトリの深さが高々2個ならば次のようにたった1行のコマンドで十分である。
$ mv ~/pictures/{,*/,*/*/}*.jpeg ~/tmp
上のコマンドの意味は、「~/picture/*.jpeg, ~/picture/*/*.jpeg, ~/picture/*/*/*.jpegを~/tmpに移動せよ」である。しかし、あらかじめディレクトリの深さの上限が分かっていない場合や調べるのが面倒な場合はどうすれば良いだろうか?私はファイルグラブで解決する方法は知らないのだが、findコマンドを使えばこれまたたった1行のコマンドで十分である。
$ find ~/picture -name '*.jpeg' -print0 | xargs -0 mv {} ~/tmp
findコマンドの詳細は本サイトの記事「findコマンドでファイルを探す」をご参照ください。このコマンドの意味は、「~/.picture以下に対して、jpegという拡張子を持ったすべてのファイルに対して、それらを~/tmpに移動させよ」である。
思ったこと
上の説明でファイルグラブによる良い方法を知らないと言ったことに関して。ネットで調べてみると「UNIXの部屋 コマンド検索: ファイルグロブ」というサイトで本記事と似たような説明があるが、ディレクトリの深さが任意の場合の方法が書かれていない。ファイルグラブによるうまい解決方法はないのだろうか?それとも、あまり知られていないだけだろうか?
0 コメント:
コメントを投稿