在ls / find中排除'重复'

时间:2014-01-27 09:23:18

标签: file find ls

我正在使用以下格式输出 lot 输出文件的程序:

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

道歉,如果这很容易。我确实环顾四周但找不到任何东西。

1 个答案:

答案 0 :(得分:0)

假设重复项之间的数字不同,您可以删除它们并将结果输出传递给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列中删除一个包含四个整数的序列,并且只有在之前没有看到它时才打印它。

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