- ベストアンサー
ディレクトリ以下の全ファイルのコピー方法!ドットファイルも含めてコピーするには?
- コピー元ディレクトリ以下の全ファイルやサブディレクトリをコピーする方法について説明します。
- 通常のコピー操作では、ドットファイルはコピーされませんが、特定の方法を使えばドットファイルも含めてコピーすることができます。
- シェルオプションのdotglobを一時的にONにしてからcpコマンドを実行するか、別途ドットファイルを指定する方法があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
cp -Rf /src/* /src/.* /dest/ だと/src/. や /src/.. も含んでしまうのでダメでしょうね。 shopt -s dotglob してからやる方が良いと思います。 またはtarを使うか。
その他の回答 (4)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
てゆ~か、 $ cp -Rf /src /dest ってやったら、/srcがディレクトリだから、中身が丸っと全部コピーされないか?
お礼
chie65535さん 回答ありがとうございます。 これだと駄目ですね。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
bashとかだと、dotglobしても、*を展開すると . と .. が入ってきちゃうから、dotglobでも駄目な場合も。 手っ取り早いのは $ cp -Rf /src/* /src/.[!.]* /src/..?* /dest/ かなあ? ..doubledotfile っていうファイルが無いなら $ cp -Rf /src/* /src/.[!.]* /dest/ でも可かな? ともかく「echoで試してから」で。
お礼
chie65535さん 回答ありがとうございます。 > bashとかだと、dotglobしても、*を展開すると . と .. が入ってきちゃうから、dotglobでも駄目な場合も。 dotglobしても echo .* の場合 . や .. が表示されますが、そもそもdotglobするのは .* とかしたくないからするのであってdotglobがONの場合の echo * では . や .. は含まれません。 dotglobが駄目なケースとは具体的にはどのような場合でしょうか? 回答を拝見していてchie65535さん自身が混乱されているように見えることからも、やはり dotglob を使うのがシンプルでわかりやすくていいのかなと正直思いました。 ごめんなさい :) Linuxでのドットファイルや名前に空白が入るファイルの扱いは、私が慣れていないだけかもしれませんが、結構気を使いますね。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
因みに。 /src/ディレクトリに、a,b,c,d,e,f,g,.a,.b,.c,.h,.i,.jの12個のファイルがあった場合 $ cp -Rf /src/* /dest/ ってやると、*のワイルドカードに引っ掛かるのはa,b,c,d,e,f,gなので、シェルが「/src/*」を「/src/a /src/b /src/c /src/d /src/e /src/f /src/g」に展開し、ファイルを1つ1つ指定したのと同じ状態にしてから、cpを実行する。 つまり $ cp -Rf /src/a /src/b /src/c /src/d /src/e /src/f /src/g /dest/ が実行される。 cpは、引数が3つ以上指定された場合は「1番目から、最後の引数の1つ前まで」のファイル群を「最後の引数に指定されたディレクトリにコピーする」と言う仕様になっている。 なので $ cp -Rf /src/* /src/.* /dest/ ってやると、*のワイルドカードに引っ掛かるのはa,b,c,d,e,f,gの6つ、.*のワイルドカードに引っ掛かるのは.a,.b,.c,.h,.i,.jの6つなので、シェルが「/src/* /src/.*」を「/src/a /src/b /src/c /src/d /src/e /src/f /src/g /src/.a /src/.b /src/.c /src/.h /src/.i /src/.j」に展開し、ファイルを1つ1つ指定したのと同じ状態にしてから、cpを実行する。 つまり $ cp -Rf /src/a /src/b /src/c /src/d /src/e /src/f /src/g /src/.a /src/.b /src/.c /src/.h /src/.i /src/.j /dest/ が実行され、すべてのファイルがコピーされる。 以下の2つの事を覚えておいて欲しい。 ・cpのソースファイルの指定は、複数のファイルを列挙しても良い ・ワイルドカードの展開はシェルがやっている。実行するコマンドがやっているのではない なお「ワイルドカードの展開結果が正しいかどうかを確認する場合」は echo /src/* /src/.* を実行してみると良い(特に「.」と「..」がどうなるか不安な場合に)
お礼
chie65535さん ワイルドカードの解説ありがとうございます。 最近シェルを本格的に(?)勉強し始めたのでよい復習になりました。 ちなみに find . -name '*.txt' の場合の * はシェルではなく、findコマンド自身が展開するというのは最近知りました ^^;
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
$ cp -Rf /src/* /src/.* /dest/ では駄目なの?
お礼
chie65535さん 回答ありがとうございます。 No.2でlowrider_2005さんが仰っていますが、/src/.. が含まれてしまうので駄目なんですよね。
お礼
lowrider_2005さん 回答ありがとうございます。 質問してから色々と考え試してみましたが、仰るとおりdotglobを一時的にONにするのが一番シンプルで混乱がないという結論に導かれていきました :) 確かにtarでやる方法もありますね。 でもdotglobが簡単ですね。