Как передать подстановочный знак GLOB в rsyn c, обернутый консолью Symfony? - PullRequest
0 голосов
/ 17 апреля 2020

Что я хочу сделать

Я хочу переместить все XML файлы из /source/ в /target/

Как я пытаюсь сделать это

rsync -avz --remove-source-files /source/*.xml /target/

Я использую Symfony Компонент Process / Console в качестве оболочки для rsyn c.

  • Компонент процесса ^ 5.0
  • Symfony Консоль ^ 4.3
  • PHP 7.2.

protected function execute(InputInterface $input, OutputInterface $output){   
        $process = new Process([
            'rsync', '-azv', '--remove-source-files',
            $input->getArgument('source-path'),
            $input->getArgument('target-path')
        ]);
}

Мои проблемы

Вызов моей команды по выполнение php bin/console command:moveFiles /source/*.xml /target/ приводит к:

Too many arguments, expected arguments "command" "source-path" "target-path".

Кажется, что * в /source/*.xml сбрасывает Symfony (?) и не дает ему распознать правильное количество аргументов предоставлено. Экранирование *, как в rsync -avz --remove-source-files /source/\*.xml /target/, приводит к:

rsync: link_stat "/source/*.xml" failed: No such file or directory (2)

Как я могу передать подстановочный знак GLOB rsyn c, завернутый в symfony? Есть ли другой способ добиться этого с помощью консоли?

1 Ответ

0 голосов
/ 22 апреля 2020

Так что мне действительно не удалось решить проблему, но я создал обходной путь:


    protected function configure()
    {
        $this->setName('jaya:moveFiles')
            ->addArgument('source-path')
            ->addArgument('target-path')
            ->addArgument('include-filext')
            ->setDescription('Sync files with option --remove-source-files from „source-path“ to „target-path“.');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
    $src = $input->getArgument('source-path');
    $target = $input->getArgument('target-path');
    $include = $input->getArgument('include-filext');

    $process = new Process([
        'rsync', '-avz', '--remove-source-files', '--include="*.' . $include . '"',      $src, $target
    ]);
    $process->run();
}

Я добавил еще один inputArgument, называемый include-fileext, в который я могу передать некоторую строку расширения файла ('pdf ',' xml ',' jpg ', ...). Это расширение файла объединяется с печально известным символом подстановки '*'. Таким образом, я на самом деле не пропускаю подстановочный знак как часть параметра и поэтому избегаю проблем.

Вместо передачи '/source-path/*.xml' и '/ target-path / 'Я передаю' / source-path / ',' pdf 'и' / target-path / '. В результате консоль Symfony выполняет rsync -avz --remove-source-files --include="*.pdf" /source-path/ /target-path/ и передает только файлы, соответствующие моему шаблону включения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...