シェルスクリプトで特定の名前のディレクトリを除外してコピーする方法

このQ&Aのポイント
  • シェルスクリプトで、特定の名前のディレクトリを除外して別の場所へコピーする方法について質問です。
  • 特定の名前のディレクトリをコピーしない方法について考えていますが、意図どおりに動作しません。
  • ディレクトリ名が「Taro」であるディレクトリを除外してコピーする方法について教えてください。
回答を見る
  • ベストアンサー

シェルスクリプトで、コピーする際に、特定の名前のディレクトリを除外

シェルスクリプトで、 あるディレクトリ(原則として、配下のディレクトリ・ファイルもすべて)を別の場所へコピー(上書きコピー)したいのですが、それに関して質問します。 仮に、dirAという名前のディレクトリを、それに対応するdirBというディレクトリへ上書きコピーするということにします。 dirAとdirBは、似たディレクトリ構成を持つと、イメージしてください。(対応するディレクトリがあるとは限らないが。) dirAディレクトリを単純にコピーするならば、cpコマンドの -R オプションを使えばいいと思います。 しかし、dirAディレクトリ配下のうち、ある特定の名前(固定)を持つディレクトリ(そこにあるファイルも。)はコピーしたくないのです。そのためには、どうすればよいのでしょうか。 仮に、そのコピーしないディレクトリの名前をTaroとすると、私は、次のようにすることを考えましたが、これは意図どおり動きません。 find dirA ! \( -name "Taro" \) -a -type d -exec cp -R {} dirB \; 尚、次のことがわかっています。 ・このディレクトリTaroは、dirAやdirBの配下のいろいろなディレクトリに散在する。 ・このディレクトリTaroの配下には、ディレクトリは存在しない。(dirA・dirBのいずれでも。)

noname#15902
noname#15902

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

こんなのどうでしょう。 mkdir dirB ; cd dirA ; find . -type d -name Taro -prune -o -type f -exec cp --parents {} ../dirB \;

noname#15902
質問者

お礼

ありがとうございます。ご回答ので大丈夫そうです。 (dirBが存在する場合、mkdir dirB は使いませんが。)

その他の回答 (2)

  • anights
  • ベストアンサー率72% (35/48)
回答No.2

使い古された手ですが、 cd dirA; tar czf - . --exclude Taro | tar xzf - -C dirB もし、dirBが存在しないのなら cd dirA; tar czf - . --exclude Taro | (mkdir -p dirB; tar xzf - -C dirB) とか。 あとは、お好みでtarのオプションをいじれば大抵はコントロール出来ると思います。

noname#15902
質問者

補足

質問に関して言うと、どうも、次のような感じにやると意図どおり動くみたいです。 cd dirA; find . ! -path "*/Taro/*" -a -type f -exec cp --parents  dirAのパス/{}  dirBのパス  \; (ただし、dirAにてファイルを持たないディレクトリは、dirBには作られない。)

回答No.1

rsync を使うのはどうですか? --exclude オプションで除外したいディレクトリ名を指定すれば良さそうです。

noname#15902
質問者

お礼

ありがとうございます。

関連するQ&A

  • 「Perlスクリプトを使ってCD→特定のDirectoryにコピー」する方法

    LINUX環境で CDに入っている「Perlスクリプト(AA.pl」を実行すると、CDに入っている他のDirectory構造(DirA)を丸ごと指定したDirectory(DirB)にコピーすることは可能でしょうか。インストーラみたいなものを作ろうと思いますがその方法が分かる方教えてください。 つまり、 (1)CD-ROMのAA.pl実行 (2)CD-ROM/DirA (3)/home/usr/userA/DirBにDirAをCopy したいです。 以上宜しくお願いします。

    • ベストアンサー
    • Perl
  • Linux初心者です。cpコマンドの使い方について質問させてください。

    Linux初心者です。cpコマンドの使い方について質問させてください。 あるディレクトリ(dirA)の中身を、隠しファイルも含めてすべて、 別のディレクトリ(dirB)の配下へとコピーしたいのですが、 ====================================================== > cp dirA/* dirB とすると、隠しファイルがコピーされず、 > cp dirA dirB とすると、dirBの配下に新たにdirAが作られてしまいます。 ====================================================== コピー元のdirAとコピー先のdirBを統合して、なおかつ 隠しファイルもコピーしたいのですが、 > cp dirA/* dirB; cp dirA/.* dirB のようにコマンドを二つに分けるしかないのでしょうか。 一つのコマンドでできる方法がありましたら、 ご教授お願いします。

  • 特定の拡張子だけディレクトリを維持したままコピー

    UNIXコマンドでcp -r とすればディレクトリの形を維持したまま再帰的にコピーできますよね。ここで特定のファイル名や拡張子(例えば.mp3)だけコピーしたいという場合、どのようなコマンドを使えばいいですか?

  • ディレクトリ以下の全ファイルのコピー

    /src/ディレクトリにあるすべてのファイルやサブディレクトリを/dest/ディレクトリにコピーしたいと思っています。 ただ、次のコマンドでは/src/.dotfileといったドットファイルはコピーされません。 $ cp -Rf /src/* /dest/ このようなドットファイルも含めてすべてのファイル、サブディレクトリをコピーするにはどのようにするのがよいのでしょうか? 次のような方法が思い浮かびましたが、もっとシンプル or スマートな方法がありましたら教えてください。 (a)シェルオプションのdotglobを一時的にONにしてから、上記cpコマンドを実行する。 (b)/src/直下のドットファイルだけ別途指定する。 $ cp -Rf /src/{*,.[^.]*} /dest/

  • ディレクトリの中身(ファイル)をコピーするコマンドは?(fedora)

    こんにちは。 fedora core5を使っていてCPコマンドで困りました。 cp -R /home/aaa /home/bbb と入力して、aaaというディレクトリの中身のファイルを全てbbbというディレクトリへコピーしようとしたのですが、これではaaaというディレクトリごとbbbへコピーされてしまい、/home/bbb/aaa みたいになってしまいます。 指定したディレクトリの中のファイルを全て別ディレクトリへコピーするときはどのように指定すればよいのでしょうか?

  • Sambaの拒否と認証の基準が知りたい

    はじめまして。katsu-kitiと申します。 いろいろoption付けてGoogle検索したのですが、狙ったものが出ず、こちらにお助け願いたく質問します。宜しくお願い致します。 Windows環境で、Sambaのファイル共有サーバにアクセスすると 「\\hogehogeにアクセス出来ません。このネットワークリソースを使用するアクセス許可がない可能性があります。アクセス許可があるかどうかこのサーバーの管理者に問い合わせて下さい」 というダイアログが出て拒否される場合と 認証ダイアログが出てユーザ名とパスワードを求められる場合があります。 パーミションを付けたディレクトリをいくつかSamba共有し、それぞれのディレクトリに、アクセスしてくる人に対して上記のような即拒否でなく、認証画面を出して駄目なら拒否という運用がしたいのです。 登録しているユーザは 1) Administrator ->dirAにrwxで、dirBにrwx 2) Userhoge ->dirAにrwxで、dirBに--- 3) userboge ->dirAにr--で、dirBにrw- 4) everyone ->dirAにr--で、dirBにr-- といった感じです。 宜しくお願い致します。

  • シェルスクリプトについて教えてください

    以下のようなフォルダ構成があります。 /var/tmp/組織コード/log このlogディレクトリ配下に0byteのファイルがたくさんあり、それを全て定期的に削除したいと思っています。 また、同ディレクトリにはそれ以外のファイルやフォルダも入っていて、それらは絶対に削除してはいけないものです。 以下のようなコマンドを考えたのですが、なにか懸念される点はあるでしょうか? find /var/tmp/*/log -size 0c -exec rm {} \; いろいろ調べたのですが、Linux系は初心者のため、これで妥当かどうか不安なのです。 環境はSolaris11で、bashです。 「組織コード」の部分を固定値にしてコード数分コマンドを書けば確実だとは思いますが、組織コードが増えたり変わるたびにシェルにもメンテが必要になるので、イマイチだと思っています。 詳しい方、ぜひアドバイスしていただけないでしょうか。 よろしくお願いします。

  • .htaccessファイルの設定方法(IP制限)

    ディレクトリ/html/内に.htaccessファイルを作成し、ファイルやフォルダへのアクセスを制限したいと思ってます。 /html/内には、fileA、dirA、dirBがあるとし、fileAとdirBにアクセス制限(IPアドレス制限)をかけるには.htaccessファイルにどのように記述すれば良いのでしょうか? アドバイスをよろしくお願いいたします。

  • ディレクトリのコピー、リネイム

    こんにちは。 現在、PHP上であるディレクトリをコピーして 異なる名前で作成したいと考えておりましたが ファイルコピーの方法しかわかりませんでした。 ディレクトリのコピーはできないのでしょうか?

    • ベストアンサー
    • PHP
  • シェルスクリプトによる、ファイルコピーと比較方法

    CentOSサーバに1台の外付けHDD(外付けA)がつながっています。 容量が一杯になりもう1台外付けHDD(外付けB)をつなげてデータの移動することにしました。 <外付けHDD:A 保存データディレクトリ> /hdda------/databackup --- /Srv    |      |           |----- /apache/20130201access.log    |      |           |----- /squid/20130201access.log    |      |          |--- /file.gz    |      |    |      |----------- /aaa.txt    |    |------ /share ------ /userdata                       |------ /userAディレクトリ                       |------- /userBディレクトリ   上記のように、ディレクトリ階層がきちんと決まっているわけではありません。 HDD:Aのデータを、新規HDD:Bに移動させたいと思います。 ただ、ファイルやディレクトリ数が多すぎるため、 第2階層(/databackup や/share)ディレクトリを指定し、 何回かに分けてバックアップしたいと思っています。 (/hdda はCentOSサーバの/mnt/hddaにマウントしています。) <考えたバックアップの流れ>、 1./databackup や/share の第2階層ディレクトリごとに数回に分けて  シェルスクリプトでcron実行させたいと思います。 2.バックアップ対象親ディレクトリ(/databackup や/share)をリスト(ファイル)に記述し、  親ディレクトリ配下すべてをHDD:Bにコピーしたいと思っています。 3.「コピー元HDD:Aディレクトリのコピーデータ」と「コピー先:HDD:Bディレクトリのコピー後データ」を diffして、正確にコピーできたかの確認。(比較した結果ログも残したい) と理論で考えはしましたが、どのようにシェルスクリプトを書けば 出来るのかわかりません。 ご教授願えないでしょうか。 よろしくお願いします。