web-dev-qa-db-ja.com

ドットで始まる名前のファイルをコピーするにはどうすればよいですか?

ディレクトリAのすべてのファイルをディレクトリBにコピーしようとしています。たとえば、ディレクトリAのすべてのファイルはドットで始まっています。次に例を示します。

A/.a
A/.b
A/.c

私が使用した場合に見つけたもの:cp A/* B、常にエラーが発生します:

cp: cannot stat 'A/*': no such file or directory

ドットで始まるエントリを処理するためのcplsのオプションがないようです。誰でもそれを修正する方法を知っていますか?

28
user59285

その理由は、bash*には、ドット(.)。

あなたは走ることができます

cp A/.* B

コピーしなかったことを警告します.または..、または任意のサブディレクトリですが、これで問題ありません。

または、ドットファイルと通常のファイルを一緒にコピーする場合は、次を実行します。

cp A/.* A/* B

あなたも走ることができます

shopt -s dotglob
cp A/* B

bashでは機能しますが、shでは機能しません。

そして、サブディレクトリもコピーされることを気にしない場合は、これが最も簡単です。

cp -R A/ B

ヒント:ワイルドカードが期待どおりに動作しない場合は、エコーで実行してみてください。

$ echo A/*
A/file1 A/file2

$ echo A/.*
A/. A/.. A/.hidden1 A/.hidden2

$ echo A/.* A/*
A/. A/.. A/.hidden1 A/.hidden2 A/file1 A/file2

$ shopt -s dotglob
$ echo A/*
A/file1 A/file2 A/.hidden1 A/.hidden2
36
Mikel

Bashの場合、コピーする前にdotglobを設定できます

shopt -s dotglob
cp A/* /destination

またはプログラミング言語

$ Ruby -rfileutils -e  'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'

Dotglobを設定したくない場合は、

cp A/.* /destination 2>/dev/null
7
kurumi

あなたが探しているのは、次のようなものです:

cp A/.??* B/

これは、すべてのドットファイルに一致しますが、「。」には一致しません。または「..」。上記のソリューションのほとんどは、再帰的に作業しない限り問題ありません。しかし、次のようなことをしたいと思ったらすぐに:

cp -R A/.??* B/

「..」を省略せずに、非ドットファイルを含むすべてを親ディレクトリから下にコピーします。

7
John Westlund

私は以下を試しましたが、うまくいきます...

cp A/.* B/
2
Andrew White

それはcpの-​​faultではなく、bashです。bashは、すべての非表示ではない(つまり、*で始まっていない)ファイルで.を展開します。

Bashは.*を(A/.*で始まる)展開しますが、すべてのファイルは.で始まりますが、残念ながら...も含まれています(現在と親ディレクトリ)おそらくスキップします。 (zshのような他のシェルはそれらを含まず、IIRCもいくつかのオプションを設定した後にbashすることに注意してください)。

簡単な解決策は、.に一致するファイルから...*を、次のような(非常に)ハックな方法で削除することです。

cp $( for F in A/.*; do echo $F | grep -v "^\.*$"; done ) B

またはこれ(おそらくよりクリーン:findを使用して、コピーするファイルを検索します):

cp $( find A -maxdepth 1 -mindepth 1 -name ".*" ) B

しかし、おそらくよりクリーンな解決策を見つけるでしょう。

2
peoro

それらがすべてドットで始まる場合は、A/.*

[[email protected] test]$ cp A/* B
cp: cannot stat `A/*': No such file or directory

[[email protected] test]$ cp A/.* B
cp: omitting directory `A/.'
cp: omitting directory `A/..'
[[email protected] test]$ ls -al B
total 8
drwxrwxr-x. 2 holt holt 4096 2011-03-31 16:57 .
drwxrwxr-x. 4 holt holt 4096 2011-03-31 16:57 ..
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .a
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .b
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .c

お役に立てれば!

1
Xavier Holt

このスクリプトを使用できます

IFS = $ '\ n'; $(find A -d 1);での行為do cp -R "$ act" B;終わった

1
teki

コピー:

cp A/.* B

リスト:

ls -l A/.*

降順のディレクトリなしでファイルを一覧表示します。

ls -ld A/.*
0
Blessed Geek

除外する必要があります。そして.. cpに渡されるファイルリストから!

これは安全です:

ls -1d A/.[a-zA-Z]* | xargs -i cp -rp {} B
0
AmitP

これは古いスレッドですが、私は常にすべてのファイルをコピーできました。 「。」で始まるファイル/フォルダーを含む

例では、すべてのファイルとフォルダーをコピーします。

cp -aup /root/.*/backup/root /

0
Ontologik