Regex 大括号内的正则表达式(花括号)——gnu并行/xargs/find

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

我在使用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

我已经读过了,但是无法用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 {..}