6

6月 15

 

[linux] あるディレクトリの中のサブディレクトリ郡中のファイルのみに処理を行う

mint-logo-200

ディレクトリAの中にあるサブディレクトリ郡(多層構造)の中に入ってるファイルのみディレクトリAの中にあるresultディレクトリにコピーする

コマンド置換を使ってやってみる事に。
$(コマンド列) または コマンド列でシェル上にコマンドを展開した状態にする事ができる。
で囲むやり方は、後方互換性のために存在しているので、$()を使ったほうがいい)

たとえば
$ date +%Y%m%d で今日の日付が出力されるが

$ touch $(date +%Y%m%d).txt

とすると、20150605.txtと言ったファイルが出来上がる。
これを利用してやってみようかと思い

cp $(find . -type f) ./result
とするも上手く行かなかった。(原因不明)

それでまあ結論をいうと以下のコマンドでやりたかった事が実現できました。

find . -type f -exec cp {} ./result \;

find の -exec オプションを利用しました。

-exec command ;
command を実行する。コマンドの戻り値が 0 ならば真。
find のコマンドラインで指定されたこれ以降の引き数は、 ;' を含む引き数にいたるまで、すべてcommand の引き数とみなされる。
文字列
{}’ は現在処理しているファイル名に置き換えられる。
これは command 引き数のどこにあってもよく、単独で置かれていなくてもよい (単独で置かれていなければならないような find もある)。
これらの文字はシェルによって展開されないよう、 `\’ によってエスケープするか引用符で囲む必要がある。
コマンドは find を実行したディレクトリから実行される。

上の文章はこちらのサイトを参考にさせてもらいました
findのexecが便利 – マツモブログ

それで師匠のdyama氏からもうひとつの方法を教えてもらいました。

find . -type f | xargs -I{} cp “{}” result

xargsコマンドについてはこちらが詳しい
Linuxコマンド集 – 【xargs】標準入力から生成したコマンドラインを実行する:ITpro

つまり find. -type f の 結果 x 行数分が xargsに渡され -I{}によって”{}”に findの結果が展開されます。
-I{} はべつに -Iあ とかでもいい模様。
こっちのほうが綺麗に動作した感じありました。

dyama氏ありがとうございました。

氏の運営されているウェブサイトはこちら↓
dyama's page | There's more than one way to do it!




2 Comments

  1. dyama より:

    ブログ更新おつかれさまです!
    さっそくもりもり使ってますね〜!

  2. 管理人 より:

    dyama師の導きによって今回の問題も解決する事ができました!ありがとうございます!
    今後ともモリモリ使わせてもらいます♪

コメントを残す