Ответ 1
Не уверен, почему то, что вы пытаетесь, не сработало (но что такое команда "copy"?), но это работает на Linux по крайней мере:
cp -r ~/plugins/abc* ~/destination
У меня есть каталог ~/plugins/
и внутри есть много подкаталогов. Если бы я хотел создать резервную копию в другом месте только подкаталогов, начиная с abc
, могу ли я сделать это с помощью команды копирования одной строки? Я бы предположил, что что-то вроде этого будет работать (но это не так):
cp -R ~/plugins/abc* ~/destination/
Я бы предпочел использовать однострочную команду, если это возможно, потому что я также хотел бы использовать тот же синтаксис для rsync, и если мне нужно сделать что-то вроде
find ~/plugins/ -type d -name "abc*" -exec cp -R {} ~/destination;
тогда это отлично работает для команды cp
, но это будет означать, что мне придется запускать rsync один раз для каждого каталога и это просто не кажется эффективным: (
Не уверен, почему то, что вы пытаетесь, не сработало (но что такое команда "copy"?), но это работает на Linux по крайней мере:
cp -r ~/plugins/abc* ~/destination
Вот старый трюк, который я часто использую:
(cd ~/plugins/ && tar cfp - abc/) | (cd ~/destination && tar xfpv -)
где p
сохраняет атрибуты, а ~/destination
может быть где угодно.
Можно использовать вывод 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#!/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);