server-memo.net

cp --parnentsでフォルダ構造(パス)まるごとコピー

   

あまり使う機会はないかもしれませんが、「cp」で指定したデータのみフォルダ構造ごとコピーする方法です。

「parnents」オプションでまるごとコピー

「cp」コマンドでデータをコピーする際に「--parents 」オプションを使用すること、ディレクトリ構造(パス)ごとコピーをすることが出来ます。

cp --parnents コピー元 コピー先

下記のようなディレクトリ構造の「work/data/user.txt」ファイルをコピーする場合、通常の方法であれば「user.txt」のみがコピーされますが、「--parents」オプションを使用することで、「work/data/user.txt」といったように途中のディレクトリ付きでコピーすることが出来ます。

$ tree --charset=C work
work
|-- data
|   |-- list.txt
|   |-- number.txt
|   `-- user.txt
`-- logs
    `-- access.log

2 directories, 4 files

「--parents」の使用例

「--parents」オプションの使用例として「work/data/user.txt」を「test」ディレクトリにコピーをしてみます。

$ mkdir test
$ cp --parents -v work/data/user.txt test
work -> test/work
work/data -> test/work/data
‘work/data/user.txt’ -> ‘test/work/data/user.txt’

「ls -R」コマンドで「test」フォルダを確認すると、途中の「work」「data」といったディレクトリ構造ごと「test」ディレクトリにコピー出来ていることが確認できました。

$ ls -R test
test:
work

test/work:
data

test/work/data:
user.txt

「--parents」 オプション無の場合

「--parents」 オプションを使用せずに「cp」のみでコピーを行った場合は、指定した「user.txt」ファイルのみ「test」ディレクトリにコピーされてしまいます。

$ cp -pv  work/data/user.txt test
‘work/data/user.txt’ -> ‘test/user.txt’

「test」ディレクトリの直下に「user.txt」コピーされています。

$ ls test
user.txt

「-R」オプションを使用した場合

「-R」オプションでworkディレクトリをまるっとコピーすると、ディレクトリ構造は当然コピーされますが、必要のないデータまでコピーされてしまいます。

$ cp -Rpv work/ test
‘work/’ -> ‘test/work’
‘work/logs’ -> ‘test/work/logs’
‘work/logs/access.log’ -> ‘test/work/logs/access.log’
‘work/data’ -> ‘test/work/data’
‘work/data/user.txt’ -> ‘test/work/data/user.txt’
‘work/data/number.txt’ -> ‘test/work/data/number.txt’
‘work/data/list.txt’ -> ‘test/work/data/list.txt’

「ls -R」コマンドで「test」フォルダの中身を確認してみると、当然ですが「work」ディレクトリ中身すべてがコピーされています。

$ ls -R test
test:
work

test/work:
data  logs

test/work/data:
list.txt  number.txt  user.txt

test/work/logs:
access.log

 - cp