如何将通配符 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 的包装器。
- 进程组件 ^5.0
- Symfony 控制台 ^4.3
- PHP7.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?有没有其他方法可以使用控制台实现此目的?
所以我确实没有设法解决问题,但我创建了一个解决方法:
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/
并仅传输与我的包含模式匹配的文件。
我想做什么
我想将所有 XML 个文件从 /source/
移动到 /target/
我是怎么做到的
rsync -avz --remove-source-files /source/*.xml /target/
我正在使用 Symfony 进程/控制台组件作为 rsync 的包装器。
- 进程组件 ^5.0
- Symfony 控制台 ^4.3
- PHP7.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?有没有其他方法可以使用控制台实现此目的?
所以我确实没有设法解决问题,但我创建了一个解决方法:
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/
并仅传输与我的包含模式匹配的文件。