1

我想做的事

我想将所有 XML 文件/source//target/

我如何尝试做到这一点

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

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

  • 流程组件 ^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 传递给 symfony 包装的 rsync?有没有另一种方法可以使用控制台来实现这一点?

4

1 回答 1

1

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


    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-path/”。这会导致 Symfony 控制台执行rsync -avz --remove-source-files --include="*.pdf" /source-path/ /target-path/并仅传输与我的包含模式匹配的文件。

于 2020-04-22T11:01:31.563 回答