web-dev-qa-db-fra.com

Comment copier récursivement des répertoires commençant par "abc" sous Linux/Unix?

J'ai un répertoire ~/plugins/ et à l'intérieur il y a beaucoup de sous-répertoires. Si je voulais créer une sauvegarde ailleurs que des sous-répertoires commençant par abc, puis-je le faire avec une commande de copie d'une ligne? Je suppose que quelque chose comme ceci fonctionnerait (mais cela ne fonctionne pas):

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

Si possible, je préférerais utiliser une commande d'une ligne, car j'aimerais aussi utiliser la même syntaxe pour rsync, et si je dois faire quelque chose comme:

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

alors cela fonctionne très bien pour la commande cp mais cela signifierait que je devrais exécuter rsync une fois pour chaque répertoire et que cela ne semble pas efficace:

38
cwd

Vous ne savez pas pourquoi ce que vous essayez n'a pas fonctionné (mais quelle est la commande "copy"?), Mais cela fonctionne au moins sous Linux:

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

Voici un vieux truc que j'utilise encore fréquemment:

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

p conserve les attributs et ~/destination peut être n'importe où.

5
Dirk Eddelbuettel

Il est possible d’utiliser la sortie de find avec rsync:

# warning: untested
find ~/plugins/ -type d -name "abc*" -print0 | rsync -av --files-from=- --from0 ~/plugins/ ~/destination
  • le -print0 dans find et le --from0 dans rsync permettent de s'assurer que nous traitons correctement les fichiers avec des espaces
  • le --files-from=- indique que nous lisons une liste de fichiers de stdin
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);

nommer cet extrait de code par exemple copyfile

TESTED: utilisation: ./copyfile 

0
johnny brasseur