やりたいこと
以下状況で
$ 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ファイルが直に置かれてしまいます。
以上、たまに打ちたくなるコマンドなので備忘録でした。