動機
複数ディレクトリの中にある複数ファイルからファイルをひとつだけ取り出して別ディレクトリにコピーしたいと思いました。Macで。なるべく無駄なく。
結論
ディレクトリ構造がdirectory/subdirectories/files.txt
だった場合。
echo directory/* | xargs -n 1 sh -c 'find $0 | sort | head -n 2 | grep .txt | xargs -I{} cp {} toDirectory/'
キモ
まず、echo directory/*
でサブディレクトリだけ表示させます。
それをxargs -n 1
でひとつづつ次のコマンドに渡します。
で、サブディレクトリの中身をfindして、今回はアルファベット順で先頭になるファイルだけ用いたかったので、sort
をかけます。そして、head -n 2
で先頭2行だけを取得。1行目はサブディレクトリ名、2行目はアルファベット順で先頭になるファイルです。今回ファイル名には.txt
の拡張子がついているので、grep .txt
でそれを抜き出します。ここはhead -n 2 | tail -n 1
でもいいです。
それをさらにxargsに渡して、こんな感じに変数を作ってcpに渡します。
ここ、普通にGNU cpならxargs cp --target-directory=toDirectory
でいいのですが、Macのcpは実は--target-directory
および-t
オプションがないらしいのです。なので、こんな書き方をするそうです。
参考ページ
http://web.sfc.wide.ad.jp/~sagawa/gnujdoc/coreutils-5.0/coreutils-ja_2.html#SEC6
https://lukesilvia.hatenablog.com/entry/20081026/p1
募集
もっとこんな風に書けるよ、というものがあったらぜひ教えてください。