我有一堆用以下模式命名的文件:
NAME_TYPE.viz
我有兴趣找到有多个文件的所有“NAME”。例如,假设文件列表是
A_type1.viz
A_type2.viz
1_type1.viz
1A_grop.viz
1A_grop2.viz
我想得到“A”和“1A”。
编辑:似乎我还不够清楚。
我不知道名字是什么,所以我无法搜索特定的模式。
我只想输出一个NAME
列表,其中至少存在两个与模式NAME*.viz
匹配的文件,而不是所有NAME
,只有一个NAME_*.viz
{ {1}}。
提前致谢。
Edit2:感谢@ hek2mgl我实现了
的解决方案 find /my/path/ -type f -name '*_*.viz' | sed -r 's/([^_]+).*/\1/' | sort | uniq -d
答案 0 :(得分:1)
您可以使用find
和sed
:
find /path/to/files type f -name '*_*.viz' | sed -r 's/([^_]+).*/\1/'
上面的命令会递归地查找文件,这意味着它还会在/path/to/files
的子文件夹中找到文件。如果您不希望将参数-maxdepth 1
传递给find
。
答案 1 :(得分:0)
find
- 仅查找.viz
中以/your/path/
开头的所有NAME_
个文件的解决方案:
find /your/path/ -type f -name "NAME_*.viz"
使用正则表达式:
find /your/path/ -type f -regex ".*/NAME_.*.viz"
因此,如果您想查找以.viz
或A_
开头的所有1A_
个文件:
find /your/path/ -type f -regex ".*/1?A_.*.viz"
答案 2 :(得分:0)
你的问题很复杂,我只会使用python。我测试了它,它应该适合你:
#!/usr/bin/python
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import os
import re
names = set({})
for root, dirs, files in os.walk("/your/path"):
if len(files) > 0:
for f in files:
m = re.search('^([^_]+)_.*$', f)
if m:
names.add(m.group(1))
for name in names:
print(name)
将代码放在foo.py
并运行python foo.py
,您的系统应安装python解释器,大部分都是:D