首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何编写unix正则表达式来选择cp for循环中的特定文件

如何编写unix正则表达式来选择cp for循环中的特定文件
EN

Stack Overflow用户
提问于 2019-05-27 23:21:04
回答 4查看 92关注 0票数 0

我有一个目录,里面有一堆文件。我不会描述文件名和扩展名,而是向您展示目录中的内容:

代码语言:javascript
复制
P01_1.atag  P03_3.tgt   P05_6.src   P08_3.atag  P10_5.tgt
P01_1.src   P03_4.atag  P05_6.tgt   P08_3.src   P10_6.atag
P01_1.tgt   P03_4.src   P06_1.atag  P08_3.tgt   P10_6.src
P01_2.atag  P03_4.tgt   P06_1.src   P08_4.atag  P10_6.tgt
P01_2.src   P03_5.atag  P06_1.tgt   P08_4.src   P11_1.atag
P01_2.tgt   P03_5.src   P06_2.atag  P08_4.tgt   P11_1.src
P01_3.atag  P03_5.tgt   P06_2.src   P08_5.atag  P11_1.tgt
P01_3.src   P03_6.atag  P06_2.tgt   P08_5.src   P11_2.atag
P01_3.tgt   P03_6.src   P06_3.atag  P08_5.tgt   P11_2.src
P01_4.atag  P03_6.tgt   P06_3.src   P08_6.atag  P11_2.tgt
P01_4.src   P04_1.atag  P06_3.tgt   P08_6.src   P11_3.atag
P01_4.tgt   P04_1.src   P06_4.atag  P08_6.tgt   P11_3.src
P01_5.atag  P04_1.tgt   P06_4.src   P09_1.atag  P11_3.tgt
P01_5.src   P04_2.atag  P06_4.tgt   P09_1.src   P11_4.atag
P01_5.tgt   P04_2.src   P06_5.atag  P09_1.tgt   P11_4.src
P01_6.atag  P04_2.tgt   P06_5.src   P09_2.atag  P11_4.tgt
P01_6.src   P04_3.atag  P06_5.tgt   P09_2.src   P11_5.atag
P01_6.tgt   P04_3.src   P06_6.atag  P09_2.tgt   P11_5.src
P02_1.atag  P04_3.tgt   P06_6.src   P09_3.atag  P11_5.tgt
P02_1.src   P04_4.atag  P06_6.tgt   P09_3.src   P11_6.atag
P02_1.tgt   P04_4.src   P07_1.atag  P09_3.tgt   P11_6.src
P02_2.atag  P04_4.tgt   P07_1.src   P09_4.atag  P11_6.tgt
P02_2.src   P04_5.atag  P07_1.tgt   P09_4.src   P12_1.atag
P02_2.tgt   P04_5.src   P07_2.atag  P09_4.tgt   P12_1.src
P02_3.atag  P04_5.tgt   P07_2.src   P09_5.atag  P12_1.tgt
P02_3.src   P04_6.atag  P07_2.tgt   P09_5.src   P12_2.atag
P02_3.tgt   P04_6.src   P07_3.atag  P09_5.tgt   P12_2.src
P02_4.atag  P04_6.tgt   P07_3.src   P09_6.atag  P12_2.tgt
P02_4.src   P05_1.atag  P07_3.tgt   P09_6.src   P12_3.atag
P02_4.tgt   P05_1.src   P07_4.atag  P09_6.tgt   P12_3.src
P02_5.atag  P05_1.tgt   P07_4.src   P10_1.atag  P12_3.tgt
P02_5.src   P05_2.atag  P07_4.tgt   P10_1.src   P12_4.atag
P02_5.tgt   P05_2.src   P07_5.atag  P10_1.tgt   P12_4.src
P02_6.atag  P05_2.tgt   P07_5.src   P10_2.atag  P12_4.tgt
P02_6.src   P05_3.atag  P07_5.tgt   P10_2.src   P12_5.atag
P02_6.tgt   P05_3.src   P07_6.atag  P10_2.tgt   P12_5.src
P03_1.atag  P05_3.tgt   P07_6.src   P10_3.atag  P12_5.tgt
P03_1.src   P05_4.atag  P07_6.tgt   P10_3.src   P12_6.atag
P03_1.tgt   P05_4.src   P08_1.atag  P10_3.tgt   P12_6.src
P03_2.atag  P05_4.tgt   P08_1.src   P10_4.atag  P12_6.tgt
P03_2.src   P05_5.atag  P08_1.tgt   P10_4.src
P03_2.tgt   P05_5.src   P08_2.atag  P10_4.tgt
P03_3.atag  P05_5.tgt   P08_2.src   P10_5.atag
P03_3.src   P05_6.atag  P08_2.tgt   P10_5.src

我在这个目录之外有一个文件,我需要将它复制到目录中以"_1.src“结尾的所有文件中。

我在终端应用中使用unix,所以我试着写这个for循环,但它拒绝了我的正则表达式:

代码语言:javascript
复制
for .*1.src in ./ 
> do
> cp ../1.src
> done

我以前只用Python语言编写过正则表达式,经验很少,但我的印象是.*可以匹配任何字符组合。但是,我得到了以下错误消息:

代码语言:javascript
复制
-bash: `.*1.src': not a valid identifier

然后我用下面的正则表达式尝试了相同的for循环:

代码语言:javascript
复制
^[a-zA-Z0-9_]*1.src$

但是我得到了相同的错误信息:

代码语言:javascript
复制
-bash: `^[a-zA-Z0-9_]*1.src$': not a valid identifier

我尝试了相同的带引号和不带引号的正则表达式,但它总是给出相同的“无效标识符”错误消息。

EN

回答 4

Stack Overflow用户

发布于 2019-05-28 00:19:20

在Bash 4.4.12上测试,以下情况是可能的:

代码语言:javascript
复制
$ for i in ./*_1.src; do echo "$i" ; done

这将回显每个以_1.src结尾的文件到屏幕上,因此也可以移动它。

代码语言:javascript
复制
$ mkdir tmp
$ for i in ./*_1.src; do mv "$i" tmp/.; done

我用以下数据进行了测试:

代码语言:javascript
复制
$ touch P{1,2}{0,1,2}_{0..6}.{src,tgt,atag}
$ ls
P10_0.atag  P10_5.src   P11_3.tgt   P12_2.atag  P20_0.src   P20_5.tgt   P21_4.atag  P22_2.src
P10_0.src   P10_5.tgt   P11_4.atag  P12_2.src   P20_0.tgt   P20_6.atag  P21_4.src   P22_2.tgt
P10_0.tgt   P10_6.atag  P11_4.src   P12_2.tgt   P20_1.atag  P20_6.src   P21_4.tgt   P22_3.atag
P10_1.atag  P10_6.src   P11_4.tgt   P12_3.atag  P20_1.src   P20_6.tgt   P21_5.atag  P22_3.src
P10_1.src   P10_6.tgt   P11_5.atag  P12_3.src   P20_1.tgt   P21_0.atag  P21_5.src   P22_3.tgt
P10_1.tgt   P11_0.atag  P11_5.src   P12_3.tgt   P20_2.atag  P21_0.src   P21_5.tgt   P22_4.atag
P10_2.atag  P11_0.src   P11_5.tgt   P12_4.atag  P20_2.src   P21_0.tgt   P21_6.atag  P22_4.src
P10_2.src   P11_0.tgt   P11_6.atag  P12_4.src   P20_2.tgt   P21_1.atag  P21_6.src   P22_4.tgt
P10_2.tgt   P11_1.atag  P11_6.src   P12_4.tgt   P20_3.atag  P21_1.src   P21_6.tgt   P22_5.atag
P10_3.atag  P11_1.src   P11_6.tgt   P12_5.atag  P20_3.src   P21_1.tgt   P22_0.atag  P22_5.src
P10_3.src   P11_1.tgt   P12_0.atag  P12_5.src   P20_3.tgt   P21_2.atag  P22_0.src   P22_5.tgt
P10_3.tgt   P11_2.atag  P12_0.src   P12_5.tgt   P20_4.atag  P21_2.src   P22_0.tgt   P22_6.atag
P10_4.atag  P11_2.src   P12_0.tgt   P12_6.atag  P20_4.src   P21_2.tgt   P22_1.atag  P22_6.src
P10_4.src   P11_2.tgt   P12_1.atag  P12_6.src   P20_4.tgt   P21_3.atag  P22_1.src   P22_6.tgt
P10_4.tgt   P11_3.atag  P12_1.src   P12_6.tgt   P20_5.atag  P21_3.src   P22_1.tgt   P10_5.atag  
P11_3.src   P12_1.tgt   P20_0.atag  P20_5.src   P21_3.tgt   P22_2.atag
票数 1
EN

Stack Overflow用户

发布于 2019-05-27 23:26:24

显然,我之前的回答不起作用。但这似乎是:

代码语言:javascript
复制
$ for x in `echo ./P[01][012]_1.src`; do echo "$x"; done
./P01_1.src
./P02_1.src

因此,当您单独运行此echo时,此模式将扩展为许多名称

代码语言:javascript
复制
$ echo ./P[01][012]_1.src  # note that the 'regex' is not enclosed in quotes
./P01_1.src ./P02_1.src

然后,您可以在循环中迭代这些名称。

顺便说一句,正如评论中所指出的,你甚至不需要那个echo,所以你可以将模式直接插入到循环中:

代码语言:javascript
复制
for x in ./P[01][012]_1.src; do echo "$x"; done
票数 0
EN

Stack Overflow用户

发布于 2019-05-28 04:39:37

如果你的目标不是,请纠正我

“覆盖与单个文件的内容共享相同后缀的多个现有文件”

代码语言:javascript
复制
find /path/to/dest_dir -type f -name "*_1.src" |xargs -n1 cp /path/to/source_file

请注意,如果没有-maxdepth 1选项,find将递归遍历您的目标目录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56328764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档