Perl - использование rsync из сценария perl - PullRequest
3 голосов
/ 10 января 2012

У меня проблемы с написанием простого сценария Perl, чтобы я мог синхронизировать две папки.
Мой код:

my $string= "rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/";
`$string`;

Я также пытался просто использовать строку

`rsync -va /Dropbox/Music\ \(1\)/ ~/Music/Music/;`

Далее я попробовал:

my @args=("bash", "-c","rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/");
system(@args);`

Я получаю ту же ошибку:

sh: -c: line 0: syntax error near unexpected token `(' each time

(да, эти пробелы и скобки в исходной папке - боль, но не кричи на меня, я не создавал это ...)

Ответы [ 3 ]

1 голос
/ 10 января 2012

После выполнения

my $string= "rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/";

вы увидите, что $string содержит

rsync -va ~/Dropbox/Music (1)/ ~/Music/Music/

Это не та команда, которую вы хотите выполнить.\ специально для строковых литералов в двойных кавычках Perl (среди прочих).Чтобы создать строку

rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/

Вам понадобится

$string = "rsync -va ~/Dropbox/Music\\ \\(1\\)/ ~/Music/Music/";

В качестве альтернативы, используйте форму с несколькими аргументами system.Поскольку оболочка не задействована, вам не нужно беспокоиться о создании строковых литералов для оболочки.

my $src = $ENV{HOME}.'/Dropbox/Music (1)/';
my $dst = $ENV{HOME}.'/Music/Music/';
system('rsync', '-va', $src, $dst);
1 голос
/ 10 января 2012

Perl здесь не нужен.

#!/bin/sh
rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/

Или вы можете добавить следующее к ~/.bashrc и снова войти в систему:

alias music_sync='rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/'
1 голос
/ 10 января 2012

Проблема в том, что действительная команда оболочки, которую вы запускаете,

rsync -va ~/Dropbox/Music (1)/ ~/Music/Music/

потому что все обратные слэши проглатываются Perl (поскольку он, как и Bash, использует обратную косую черту в качестве символа цитирования / экранирования). Чтобы избежать этого, вам нужно использовать одинарные кавычки:

system 'rsync -va ~/Dropbox/Music\ \(1\)/ ~/Music/Music/';

или еще раз избежать обратной косой черты:

system "rsync -va ~/Dropbox/Music\\ \\(1\\)/ ~/Music/Music/";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...