2011年11月22日火曜日

findとxargsを利用してディレクトリ構造のみをコピーする

このエントリーをはてなブックマークに追加
ディレクトリ内にあるファイルを無視して、ディレクトリのみをコピーする方法を検討して試しました。findコマンドでディレクトリのみを抽出したあと、それをパイプしてディレクトリを作る方法についてまとめました。


次のような構成のフォルダを想定します。
$ find 1
1
1/1.txt
1/2-1
1/2-1/2-1.txt
1/2-1/3
1/2-1/3/3.txt
1/2-2
1/2-2/2-2.txt
1/2-2/3-1
1/2-2/3-1/3-1.txt
1/2-2/3-2
1/2-2/3-2/3-2.txt

この構成からディレクトリのみをtoフォルダへコピーすることを考えます。以下のコマンドではfromディレクトリのみをtoディレクトリ配下に作成しています。
$ find 1 -type d | xargs -I dir mkdir to/dir

実行結果
$ find to
to
to/1
to/1/2-1
to/1/2-1/3
to/1/2-2
to/1/2-2/3-1
to/1/2-2/3-2

名前に空白が入る場合は、findに-print0、xargsに-0をつけます。

アクセス権や所有者、更新日時もコピーする場合は、それぞれchmod、chwon、touchを利用します。
$ find 1 -type d | xargs -I dir chmod --reference=dir to/dir
$ find 1 -type d | xargs -I dir chown --reference=dir to/dir
$ find 1 -type d | xargs -I dir touch -mr dir to/dir


関連:
xargsを利用して処理を並列的に実行させる
UNIX findとxargsコマンドで-print0オプションを使う理由

1 件のコメント:

  1. 参考になりました!ありがとうございます。

    返信削除