Regex 大括号内的正则表达式(花括号)——gnu并行/xargs/find
我在使用GNU parallel()的大括号(花括号)时遇到问题 我有四个文件的列表:Regex 大括号内的正则表达式(花括号)——gnu并行/xargs/find,regex,bash,shell,parallel-processing,curly-braces,Regex,Bash,Shell,Parallel Processing,Curly Braces,我在使用GNU parallel()的大括号(花括号)时遇到问题 我有四个文件的列表: file1.txt.super file2.txt.super file3.txt.super file4.txt.super 如果我发出:ls*| parallel“mkdir./{.}” 我得到了四个目录: file1.txt file2.txt file3.txt file4.txt 我的问题是,如何简单地返回四个名为: file1 file2 file3 file4 我已经读过了,但是无法用gn
file1.txt.super
file2.txt.super
file3.txt.super
file4.txt.super
如果我发出:ls*| parallel“mkdir./{.}”
我得到了四个目录:
file1.txt
file2.txt
file3.txt
file4.txt
我的问题是,如何简单地返回四个名为:
file1
file2
file3
file4
我已经读过了,但是无法用gnu并行实现这些正则表达式。我想我遗漏了什么。此外,如果您不介意使用
sed
,下面是一个解决方法:
ls * | sed 's/\..*//' | parallel "mkdir ./{}"
我不知道“.super”是什么,也不知道运行parallel时它在哪里,或者在parallel命令中使用“{.}”。好吧,并行程序像xargs一样工作,只理解{}
。我错过了什么
在任何情况下,我都会通过for循环实现目标:
for f in *; do mkdir "${f%%.*}"; done
或者,如果您真的关心这么短的作业的并行性:
for f in *; do mkdir "${f%%.*}" & done
根据《美国参考》杂志的说法,尽管它并不十分美丽,但以下几点应该是可行的:
ls *.txt.super| parallel --er {txt} 'echo {txt}|parallel "mkdir ./{.}"'
删除第二个文件扩展名的方法是从parallel调用parallel,并在parallel的父实例中将
{.}
字符串别名为{txt}
。这可能适用于您:
ls * | parallel echo {.} | parallel mkdir {.}
是的,看来你遗漏了什么。本文介绍了shell参数展开的特点。这些大括号(前面总是有$
)与parallel
实用程序的默认替换字符串无关,后者同时使用大括号。“显示”命令行选项允许使用任意字符串,而不是括号内的默认值
例如,可以将示例中的替换字符串{.}
更改为%foo
ls * | parallel --extensionreplace %foo "mkdir ./%foo"
关于linuxjournal文章中的${…}
的更多信息可以在ManBash
页面的参数扩展部分找到
由于您在@AdamLiss answer的评论中提出了这一问题,以下是(ab)使用大括号和--colsep
参数执行任务的方法:
ls * | parallel --colsep '\.' "mkdir ./{1}"
注意:如果文件名包含两个以上的句点(因为路径名在第一个句点被截断),则此--colsep
技巧(如@adamlis提出的sed
)将产生不希望的结果
但是,由于--colsep
参数是一个正则表达式,因此它应该能够适应文件名中其他位置的句点:
ls * | parallel --colsep '\.[^\.]*$' "mkdir ./{1.}"
注意:--extensionreplace
由于当前(21120422)版本的parallel中存在错误而无法工作。但由于parallel
是一个perl脚本,您可以通过更改以下内容来修复它:
"extensionreplace|er" => \$::opt_U,
到
除了这里已经很好的答案之外,我非常确定最简单的解决方案(可能是@Steve所寻找的)是:
ls * | parallel --plus mkdir {..}
中的{.}
替换字符串用于将字符串“修剪”到最外层的
字符。我相信你可以把一个字符串减少到3级
这意味着
{.}
将只减少一个级别到file1.txt
,{.}
将减少两个级别到file1
,{…}
将减少第三个级别。+1这是sed
的一个很好的用法,也是一个完美的解决方法。但是有没有更简洁的方法呢?有没有更好的方法(ab)使用花括号?您缺少了并行的文档:嗯。我的系统上显然有一个不同的版本;本地手册页中没有提到{.}。谢谢你帮我搜索,@AdamLiss.+1很好地使用了一个循环来实现并行。我暗自怀疑gnu parallel只理解{}
和{.}
有人能证实这一点吗?根据上面链接的doc@AdamLiss,gnu parallel理解各种与{}相关的表达式,但就路径名mung而言,似乎可以删除前导目录和/或单个尾随扩展名,就是这样。我知道你在这里试图做什么,但是我得到了返回:/bin/bash:{txt}:command not found
它对我也不起作用(parallel似乎不识别--er
选项并将{txt}
解释为命令),但根据最新的手册页,这是它应该起作用的方式。可能是一个并行的错误。@DanielRoethlisberger你是对的<代码>--er
不工作是由于并行
中的错误造成的。请参阅我的答案以获得修复。我没有安装并行程序,因此无法测试或读取文档<代码>并行mkdir文件{1..4}将是我的猜测。感谢所有花时间编写/回复的人。这里当然有一些很好的答案,我相信这些都会对其他学习gnupallel
的人非常有帮助。干杯+我绝对聪明。正是我想要的。您对--colsep
regex的使用非常清楚,非常有用。谢谢今天的答案是:parallel——加上mkdir./{..}
ls * | parallel --plus mkdir {..}