(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

findの結果をディレクトリ構造を保ったままコピーする方法

スポンサーリンク

やりたいこと

以下状況で

$ tree
.
├── A
│   ├── aa
│   ├── ab
│   └── ac
├── B
│   ├── ba
│   ├── bb
│   └── bc
└── C
    ├── ca
    ├── cb
    └── cc

「b」が含まれているファイルを「D」ディレクトリにコピーする

環境情報
$ bash --version
GNU bash, バージョン 4.3.42(4)-release (x86_64-unknown-cygwin)
Copyright (C) 2013 Free Software Foundation, Inc.

ワンライナー

find . -name "*b*" | xargs cp --parents -t D

ちなみに事前にディレクトリ「D」の作成は必要です。

無ければ以下のようなエラーが発生します。

$ find . -name "*b*" | xargs cp --parents -t D
cp: failed to access 'D': No such file or directory

作成後の結果は

$ tree
.
├── A
│   ├── aa
│   ├── ab
│   └── ac
├── B
│   ├── ba
│   ├── bb
│   └── bc
├── C
│   ├── ca
│   ├── cb
│   └── cc
└── D
    ├── A
    │   └── ab
    ├── B
    │   ├── ba
    │   ├── bb
    │   └── bc
    └── C
        └── cb

確かにディレクトリ構造を保ってコピーできています。

補足

ポイントは--parents部分です。
そこを省略してしまうと以下のように

$ find . -name "*b*" | xargs cp -t D
$ tree
.
├── A
│   ├── aa
│   ├── ab
│   └── ac
├── B
│   ├── ba
│   ├── bb
│   └── bc
├── C
│   ├── ca
│   ├── cb
│   └── cc
└── D
    ├── ab
    ├── ba
    ├── bb
    ├── bc
    └── cb

ファイルが直に置かれてしまいます。

以上、たまに打ちたくなるコマンドなので備忘録でした。