web-dev-qa-db-ja.com

Linux / Unixで「abc」で始まるディレクトリを再帰的にコピーする方法は?

ディレクトリがあります~/plugins/および内部には多くのサブディレクトリがあります。 abcで始まるサブディレクトリだけの別の場所にバックアップを作成したい場合、1行のコピーコマンドでそれを行うことができますか?私はこのようなものが機能すると仮定します(しかし、機能しません):

 cp -R〜/ plugins/abc *〜/ destination /

Rsyncにも同じ構文を使用したいので、可能な場合は1行のコマンドを使用します。

 find〜/ plugins/-type d -name "abc *" -exec cp -R {}〜/ destination; 

それはcpコマンドではうまくいきますが、ディレクトリごとにrsyncを1回実行する必要があり、効率的ではないようです:(

38
cwd

あなたがしようとしていることがうまくいかなかった理由はわかりません(しかし、「コピー」コマンドとは何ですか?)が、これは少なくともLinux上で動作します:

cp -r ~/plugins/abc* ~/destination
57
David Gelhar

ここに私がまだ頻繁に使用する古いトリックがあります:

 (cd ~/plugins/ && tar cfp - abc/) | (cd ~/destination && tar xfpv -)

pは属性を保持し、~/destinationはどこでもかまいません。

5

findの出力をrsyncとともに使用することができます。

# warning: untested
find ~/plugins/ -type d -name "abc*" -print0 | rsync -av --files-from=- --from0 ~/plugins/ ~/destination
  • -print0 in find、および--from0rsyncは、スペースを含むファイルを正しく処理することを確認します
  • --files-from=-は、stdinからファイルのリストを読み取っていることを示しています
2
Shawn Chin
#!/usr/bin/env Perl
# copie un fichier avec l'arbo
#
#
use File::Basename;
use File::Copy;
my $source = shift;
my $dest = shift;
if( !defined $source){ print "Manque fichier source"; exit(0); }
if( !defined $dest){ print "Manque repertoire dest"; exit(0); }

my $dir = dirname($source);
my $file = basename($source);

my @arbo = split(/\//, $dir);
my $direct  = $dest;
if( !-d $direct ) { mkdir $direct; }
foreach my $d(@arbo) {
        $direct.="/".$d;
        if( !-d $direct ) { mkdir $direct; }
}
copy($source,$direct);

このコードスニペットに、たとえばcopyfileという名前を付けます

テスト済み:使用法:./copyfile

0
johnny brasseur