Подтвердить что ты не робот

Как рекурсивно копировать каталоги, начиная с "abc" в Linux/Unix?

У меня есть каталог ~/plugins/ и внутри есть много подкаталогов. Если бы я хотел создать резервную копию в другом месте только подкаталогов, начиная с abc, могу ли я сделать это с помощью команды копирования одной строки? Я бы предположил, что что-то вроде этого будет работать (но это не так):

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

Я бы предпочел использовать однострочную команду, если это возможно, потому что я также хотел бы использовать тот же синтаксис для rsync, и если мне нужно сделать что-то вроде

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

тогда это отлично работает для команды cp, но это будет означать, что мне придется запускать rsync один раз для каждого каталога и это просто не кажется эффективным: (

4b9b3361

Ответ 1

Не уверен, почему то, что вы пытаетесь, не сработало (но что такое команда "copy"?), но это работает на Linux по крайней мере:

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

Ответ 2

Вот старый трюк, который я часто использую:

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

где p сохраняет атрибуты, а ~/destination может быть где угодно.

Ответ 3

Можно использовать вывод find с rsync:

# warning: untested
find ~/plugins/ -type d -name "abc*" -print0 | rsync -av --files-from=- --from0 ~/plugins/ ~/destination
  • -print0 в find и --from0 в rsync убедитесь, что мы правильно обрабатываем файлы с пробелами
  • --files-from=- указывает, что мы читаем список файлов из stdin

Ответ 4

#!/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

TESTED: использование:./copyfile