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:
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
Voici un vieux truc que j'utilise encore fréquemment:
(cd ~/plugins/ && tar cfp - abc/) | (cd ~/destination && tar xfpv -)
où p
conserve les attributs et ~/destination
peut être n'importe où.
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
-print0
dans find
et le --from0
dans rsync
permettent de s'assurer que nous traitons correctement les fichiers avec des espaces--files-from=-
indique que nous lisons une liste de fichiers de stdin#!/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);