Ste*_*eve 4 regex parallel-processing bash shell curly-braces
使用GNU parallel(http://www.gnu.org/software/parallel/)时遇到括号(大括号)问题
我有四个文件列表:
file1.txt.super
file2.txt.super
file3.txt.super
file4.txt.super
Run Code Online (Sandbox Code Playgroud)
如果我发出: ls * | parallel "mkdir ./{.}"
我得到了四个目录:
file1.txt
file2.txt
file3.txt
file4.txt
Run Code Online (Sandbox Code Playgroud)
我的问题是,我怎样才能简单地返回四个目录:
file1
file2
file3
file4
Run Code Online (Sandbox Code Playgroud)
我已阅读http://www.linuxjournal.com/article/8919但无法使用gnu parallel实现这些正则表达式.我想我在这里遗漏了一些东西.此外,非常感谢任何具有更复杂的正则表达式的示例.
是的,看来你在这里遗漏了一些东西.该linuxjournal文章解释了壳参数扩展的功能.那些大括号(总是在前面$)与parallel实用程序的默认替换字符串无关,后者恰好使用大括号.所述平行文档示出了命令行选项允许被用来代替它的大括号包围默认任意的字符串.
例如,您的示例中的替换字符串 {.}可以更改为%foo
ls * | parallel --extensionreplace %foo "mkdir ./%foo"
Run Code Online (Sandbox Code Playgroud)
有关${…}linuxjournal文章的更多信息man bash,请参见参数扩展部分的页面 .
由于您在@AdamLiss答案的评论中询问,这里有一种方法(ab)使用花括号和--colsep参数来执行您的任务:
ls * | parallel --colsep '\.' "mkdir ./{1}"
Run Code Online (Sandbox Code Playgroud)
注意:如果文件名包含两个以上的句点(因为路径名在第一个句点被截断),这个--colsep 技巧(如sed@AdamLiss提议的那样)会产生不良结果.
但是,由于--colsep参数是正则表达式,因此它应该适应文件名中其他位置的句点:
ls * | parallel --colsep '\.[^\.]*$' "mkdir ./{1.}"
Run Code Online (Sandbox Code Playgroud)
注意:--extensionreplace由于当前(21120422)并行版本中的错误而无法正常工作.但是因为parallel它是一个perl脚本,你可以通过更改来修复它:
"extensionreplace|er" => \$::opt_U,
Run Code Online (Sandbox Code Playgroud)
至
"extensionreplace|er=s" => \$::opt_U,
Run Code Online (Sandbox Code Playgroud)