File 不包括';副本';在ls/find中

File 不包括';副本';在ls/find中,file,find,ls,File,Find,Ls,我使用的程序以以下格式输出大量输出文件: run_1_0001.blah run_1_0002.blah run_2_0001.blah run_3_param_2_0001.blah run_3_param_2_0002.blah 每次运行都会将数千个文件放入同一目录中。文件名的头是任意的,可能包含数字。唯一一致可预测的部分是文件名以4位数字和扩展名结尾。我想写的是一个别名,它排除这些伪副本,并为每个文件集合生成一行输出。在我给出的垃圾示例中,输出为: run_1_.blah run_2_.

我使用的程序以以下格式输出大量输出文件:

run_1_0001.blah
run_1_0002.blah
run_2_0001.blah
run_3_param_2_0001.blah
run_3_param_2_0002.blah
每次运行都会将数千个文件放入同一目录中。文件名的头是任意的,可能包含数字。唯一一致可预测的部分是文件名以4位数字和扩展名结尾。我想写的是一个别名,它排除这些伪副本,并为每个文件集合生成一行输出。在我给出的垃圾示例中,输出为:

run_1_.blah
run_2_.blah
run_3_param_2_.blah

如果这很容易,我道歉。我确实四处查看了一下,但什么也没找到。

假设重复项之间只有数字不同,您可以删除它们并将结果输出传递给uniq,例如

创建测试文件:

touch some_filename_0001.blah some_filename_0002.blah some_otherfilename_0001.blah
删除数字并传递到uniq:

ls | tr -d '[0-9]' | uniq
输出:

some_filename_.blah
some_otherfilename_.blah
编辑 基于您更新的测试数据以及您希望使用
ls-la
的事实,我建议使用
awk
来解析数据。在我的
ls
版本中,文件名是
ls-la
输出中的第9个元素,因此类似这样的内容应该可以工作:

ls -la | awk '{ sub("[0-9]{4}", "", $9) } !h[$9]++'
这将从filename列中删除一个由四个整数组成的序列,并且仅在以前未看到该序列时才打印它


注意事项:这假设文件名不包含空格。此外,“runs”和“parameters”不应包含4个或更多的整数,如果是这种情况,则需要使用更高级的正则表达式来锚定替换。

通过查看示例很难说清楚。如果你有电源线,请提供。我找到了一个结合ls、sed和uniq的部分解决方案。如果扩展名为“.blah”,则可以执行以下操作:ls*.blah | sed的|[0-9]*\.blah |.blah |'| uniq ls查找所有blah文件,sed删除尾随文件号,uniq排除任何产生的重复文件。但是,这不适用于ls-la,因此不可能显示任何文件信息。如果有人有更好的办法,我很乐意听!谢谢你,托尔。但是,另一个复杂的问题是,文件名可能包含其他数字,这些数字可以区分不同的输出文件集,例如:run1_0001.blah,run2_0001.blah我对我在上面找到的内容进行了注释,这与此方法类似,但使用了sed。谢谢:)@JoeTodd:请提供更具代表性的测试数据和预期输出。非常感谢,Thor,这正是我想要的!