ディレクトリAのすべてのファイルをディレクトリBにコピーしようとしています。たとえば、ディレクトリAのすべてのファイルはドットで始まっています。次に例を示します。
A/.a
A/.b
A/.c
私が使用した場合に見つけたもの:cp A/* B
、常にエラーが発生します:
cp: cannot stat 'A/*': no such file or directory
ドットで始まるエントリを処理するためのcp
はls
のオプションがないようです。誰でもそれを修正する方法を知っていますか?
その理由は、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
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
あなたが探しているのは、次のようなものです:
cp A/.??* B/
これは、すべてのドットファイルに一致しますが、「。」には一致しません。または「..」。上記のソリューションのほとんどは、再帰的に作業しない限り問題ありません。しかし、次のようなことをしたいと思ったらすぐに:
cp -R A/.??* B/
「..」を省略せずに、非ドットファイルを含むすべてを親ディレクトリから下にコピーします。
私は以下を試しましたが、うまくいきます...
cp A/.* B/
それは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
しかし、おそらくよりクリーンな解決策を見つけるでしょう。
それらがすべてドットで始まる場合は、A/.*
:
[holt@Michaela test]$ cp A/* B
cp: cannot stat `A/*': No such file or directory
[holt@Michaela test]$ cp A/.* B
cp: omitting directory `A/.'
cp: omitting directory `A/..'
[holt@Michaela 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
お役に立てれば!
このスクリプトを使用できます
IFS = $ '\ n'; $(find A -d 1);での行為do cp -R "$ act" B;終わった
コピー:
cp A/.* B
リスト:
ls -l A/.*
降順のディレクトリなしでファイルを一覧表示します。
ls -ld A/.*
除外する必要があります。そして.. cpに渡されるファイルリストから!
これは安全です:
ls -1d A/.[a-zA-Z]* | xargs -i cp -rp {} B
これは古いスレッドですが、私は常にすべてのファイルをコピーできました。 「。」で始まるファイル/フォルダーを含む
例では、すべてのファイルとフォルダーをコピーします。
cp -aup /root/.*/backup/root /