如何将通配符 GLOB 传递给 Symfony 控制台包装的 rsync?

How do I pass a wildcard GLOB to rsync wrapped by Symfony Console?

我想做什么

我想将所有 XML 个文件从 /source/ 移动到 /target/

我是怎么做到的

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

我正在使用 Symfony 进程/控制台组件作为 rsync 的包装器。


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 传递给 symfony 包装的 rsync?有没有其他方法可以使用控制台实现此目的?

所以我确实没有设法解决问题,但我创建了一个解决方法:


    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();
}

我添加了另一个名为 'include-fileext' 的 inputArgument,我可以向其传递一些文件扩展字符串('pdf'、'xml'、'jpg'、...)。此文件扩展名与臭名昭著的通配符“*”连接在一起。这样我实际上并没有将通配符作为参数的一部分传递,因此我避免了出现问题。

我没有传递“/source-path/*.xml”和“/target-path/”,而是传递“/source-path/”、'pdf' 和“/target-小路/'。这导致 Symfony 控制台执行 rsync -avz --remove-source-files --include="*.pdf" /source-path/ /target-path/ 并仅传输与我的包含模式匹配的文件。