1

サブディレクトリを含むフォルダがありますA,B,C and D。除外しながらA and D呼び出された別のディレクトリにディレクトリをコピーする必要があります(つまり、BとCはコピーされません)。私は次のことを(コマンドライン擬似コードで)行うことを考えていました:'copy'B and C

ls (selective ls on the source directory) | 
   scp -r {returned value from the ls} {target directory}

上記を実現するためのLinuxコマンドラインの方法はありますか?

4

3 に答える 3

3

これにはfindを使用することをお勧めします。

いくつかのテスト対象を作成しましょう:

$ mkdir -p ./testing/test{1,2,3,4}
$ touch ./testing/test{1,2,3,4}/test{a,b}

結果は次のようになります。

$ ls -R ./testing
./testing:
test1  test2  test3  test4

./testing/test1:
testa  testb

./testing/test2:
testa  testb

./testing/test3:
testa  testb

./testing/test4:
testa  testb

今、実行します

$ mkdir ./testing/copy
$ find ./testing/ -mindepth 1 -maxdepth 1 ! -name test1 ! -name test3 ! -name copy -execdir cp -R '{}' ./copy/ ';'

結果は次のようになります。

$ ls -R ./testing/
./testing/:
copy  test1  test2  test3  test4

./testing/copy:
test2  test4

./testing/copy/test2:
testa  testb

./testing/copy/test4:
testa  testb

./testing/test1:
testa  testb

./testing/test2:
testa  testb

./testing/test3:
testa  testb

./testing/test4:
testa  testb

背景情報:

概要:コピーする必要のあるディレクトリを見つけて、copyコマンドを実行します。この場合、「test1」と「test3」を除くすべてのディレクトリをコピーしましょう。

-mindepth 1オプションは、findがを含めるのを防ぎます。そしておそらく..ディレクトリ、これらは深さ0にあるからです。

-maxdepth 1オプションは、findがすべてのサブディレクトリを個別にコピーするのを防ぎます。コマンドcp-Rはサブディレクトリを処理するため、サブディレクトリがカバーされます。

-execの代わりに-execdirを使用すると、cpコマンドのターゲットディレクトリとしてパス全体を含める必要がなくなります。

findを実行する前にターゲットディレクトリをmkdirすることを忘れないでください。また、このディレクトリを結果から除外することを忘れないでください。したがって、!-私の例ではコピーオプションに名前を付けます。

これがあなたを正しい方向に向けることを願っています。

于 2012-06-04T16:08:27.800 に答える
2

簡単な答えは、必要なディレクトリのみをコピーすることです。

scp -r A D anotherhost:/path/to/target/directory

これは、例で説明したことを正確に実行します。より一般的な解決策は次のようになります。

scp -r $(ls | egrep -v '^(B|C)$') anotherhost:/path/to/target/directory

このコマンドは、ソースディレクトリ内のファイルの数が多くない限り機能します。ファイルの数が増えると、最終的に「コマンドが長すぎます」というエラーが発生します。

を使用する代わりに、ファイルを含める/除外するためのさまざまなメカニズムを備えたをscp使用できます。rsync例えば:

rsync --exclude='B/' --exclude='C/' . anotherhost:/path/to/target/directory
于 2012-06-04T15:35:18.207 に答える
0

ディレクトリを本当に知っている場合は、すべてをscpに追加するだけです。

scp A/* D/* targetHost:/copy

このソリューションの唯一の問題は、コピーディレクトリ内のファイルが「混合」されることです。おそらく、それは問題ではありません:-)

于 2012-06-04T15:35:04.127 に答える