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