【问题标题】:Is there a way to create a directory by cutting a tgz file name in sections?有没有办法通过分段切割 tgz 文件名来创建目录?
【发布时间】:2022-11-01 20:04:28
【问题描述】:

所以我在这里列出了多个 .tgz 文件:

Huistaak1-HelloWorld_Jan.Janssens.s.ua_poging_2019-11-09.tgz
Huistaak1-HelloWorld_Jolien.Peters.s.ua_poging_2019-11-11.tgz
Huistaak1-HelloWorld_Jonas.De.Preter.s.ua_poging_2019-11-12.tgz
Huistaak1-HelloWorld_Len.Feremans.s.ua_poging_2019-11-10.tgz
Huistaak1-HelloWorld_Peter.Hofkens.s.ua_poging_2019-11-11.tgz
Huistaak1-HelloWorld_Sarah.Van.Hoof.s.ua_poging_2019-11-11.tgz

所以我需要从这些文件中过滤掉名称并将它们保存到一个变量中,以便我可以使用该变量来创建一个目录 注意:我不能简单地使用 -> mkdir Janssens.Jan

例如,第一个文件的名称为 - Jan.Janssens 使用该名称,我需要创建一个名为 - Janssens.Jan 的目录 总共我应该有 6 个这样的目录

Janssens.Jan
Peters.Jolien
De.Preter.Jonas
Feremans.Len
Hofkens.Peter
Van.Hoof.Sarah

有没有一种方法可以让我从每个文件中过滤掉名称,而不必遍历每个文件?

类似于 *.tgz 中的文件名;做 ...

【问题讨论】:

  • 有很多方法可以实现这一目标 - 你尝试过什么?
  • 我没有尝试太多,因为我真的不知道如何。我试过这个``` name1=$(echo Huistaak1-HelloWorld_Jan.Janssens.s.ua_poging_2019-11-09.tgz | cut -f2 -d '_') mkdir -p "$name1" ``` 但是我会必须对每个 tgz 文件都这样做,但我没有得到我需要的结果

标签: regex linux bash ubuntu


【解决方案1】:

使用bashregex。我假设名字后面总是有.s

for i in *.tgz; do
  [[ $i =~ ([^_.]+).([^_]+).s ]] && echo "${BASH_REMATCH[2]}.${BASH_REMATCH[1]}";
done

如果字符串$i 匹配正则表达式[^_.]+.[^_]+.s(我删除所有圆括号),则从数组BASH_REMATCH 中打印元素2(${BASH_REMATCH[2]}),后跟. 和数组BASH_REMATCH 中的元素1(${BASH_REMATCH[1]}) .元素 1 包含来自第一个圆括号 [^_.]+ 之间正则表达式的匹配部分,元素 2 包含第二个圆括号 [^_]+ 之间的匹配部分。 . 代表 . 而不是正则表达式的特殊字符。

输出:

詹森斯·简
彼得斯·乔利安
德普雷特·乔纳斯
费尔曼斯·伦
霍夫肯斯·彼得
范霍夫莎拉

见:The Stack Overflow Regular Expressions FAQ

【讨论】:

  • 你能解释一下这是做什么的吗? [[ $i =~ ([^_.]+).([^_]+).s ]] 我知道这是正则表达式,但我不明白你是怎么得到它的
  • @FieldyScop:我已经更新了我的答案。我希望它变得更容易理解。
猜你喜欢
  • 2021-12-09
  • 1970-01-01
  • 2021-06-25
  • 2018-09-05
  • 1970-01-01
  • 2016-04-28
  • 2020-11-18
  • 1970-01-01
  • 2019-05-20
相关资源
最近更新 更多