it-swarm.com.de

Wie kopiere ich Verzeichnisse, die mit "abc" beginnen, unter Linux/Unix?

Ich habe ein Verzeichnis ~/plugins/ und darin befinden sich viele Unterverzeichnisse. Wenn ich an einem anderen Ort nur von den Unterverzeichnissen, die mit abc beginnen, ein Backup erstellen wollte, könnte ich das mit einem einzeiligen Kopierbefehl tun? Ich würde davon ausgehen, dass so etwas funktionieren würde (aber es funktioniert nicht):

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

Ich würde lieber einen einzeiligen Befehl verwenden, da ich auch dieselbe Syntax für rsync verwenden möchte, und wenn ich sowas machen muss

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

dann funktioniert das gut für den cp-Befehl, aber es würde bedeuten, dass ich rsync einmal für jedes Verzeichnis ausführen müsste und das einfach nicht effizient erscheint :(

38
cwd

Nicht sicher, warum das, was Sie versuchen, nicht funktioniert hat (aber was ist der Befehl "Kopieren"?), Aber dies funktioniert zumindest unter Linux:

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

Hier ist ein alter Trick, den ich immer noch häufig benutze:

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

die p behält die Attribute bei und ~/destination kann sich an einer beliebigen Stelle befinden.

5

Es ist möglich, die Ausgabe von find mit rsync zu verwenden:

# warning: untested
find ~/plugins/ -type d -name "abc*" -print0 | rsync -av --files-from=- --from0 ~/plugins/ ~/destination
  • -print0 in find und --from0 in rsync stellen sicher, dass Dateien korrekt mit Leerzeichen behandelt werden
  • der --files-from=- besagt, dass wir eine Liste von Dateien von stdin lesen
1
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);

benennen Sie dieses Code-Snippet zum Beispiel copyfile

TESTED: Verbrauch: ./copyfile 

0
johnny brasseur