Macでxargsを使ってcpする

ファイル一覧を得て、それをまとめてあるディレクトリにコピーしたいなーと思って xargs に渡したところで、第一引数に渡したいけどどうするの?って思って調べたら、cp には -t [target directory] というオプションがあるようです。これを使って

{ファイル一覧を得る処理}| xargs cp -t [target directory]

とすることで目的が達成できそうです。しかし、Mac で上記のコマンドを実行すると -t が使えないようで、更に調べると Mac に最初から入ってる cp コマンドは、GNUの cp とは機能が異なるということが分かりました。

GNU の cp と同等のものを入れたい場合は、macports で coreutils てのをインストールすると良いです。

% sudo port install coreutils

こうすると、頭に g がついた形でインストールされます。例えば、cp は gcp、mv は gmv といった具合。非推奨というか、他のアプリケーションを使おうとしたときに弊害が出る可能性があるけれど、GNU の cp を cp として使いたい場合は、インストール時にオプションをつけることで実現できる。

% sudo port install coreutils +with_default_names

実際、違いで困ったことが今回初めてだったのでvariantsなしでインストールしてみました。これで、cp -t のオプション使えるようになります。mv -t も同様の動作になる。gcp と gmv としてですが。

今回やろうと思ったことは、解像度が 1920×1200 の画像だけを抽出して壁紙として使おう、ってことだったので、Mac に標準で入ってる画像いじくるコマンドの sips を使った。本当は1回で 高さと幅を絞り込みたいのだけれど、やりかたが分からなかった…。

sips -g pixelWidth [ファイル名] で、幅がとれます。表示は下記のように、2行に渡ってパスと情報がでます。

/Users/chihaya/save/壁紙/wallpaper1.jpg
  pixelWidth: 1024

grep -B n でn行前まで表示できるので、pixelWidth: 1920 でひっかけて、1行前のパスを取得して、さらにもう1回 sips で高さをとって pixelHeight: 1200 でひっかければ、1920×1200の画像とれそうです。

sips -g pixelHeight *| grep -B 1 "pixelWidth: 1920"| grep "/Users/chihaya"| xargs sips -g pixelHeight| grep -B 1 "pixelHeight: 1200"| grep "/Users/chihaya"| xargs gcp -t ./wall_papers/

とすれば、current directory にある画像のうち、1920×1200 のものを、 ./wall_papers/ 以下にコピーすることが出来ます。簡単。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です