Как рекурсивно копировать каталоги, начинающиеся с «abc» в Linux / Unix? - PullRequest
38 голосов
/ 11 марта 2011

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

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

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

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

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

Ответы [ 4 ]

56 голосов
/ 11 марта 2011

Не знаю, почему то, что вы пытаетесь, не сработало (но что такое команда «копировать»?), Но это работает как минимум в Linux:

cp -r ~/plugins/abc* ~/destination
5 голосов
/ 11 марта 2011

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

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

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

2 голосов
/ 11 марта 2011

Можно использовать вывод 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
0 голосов
/ 08 марта 2016
#!/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

...