【问题标题】:Excluding 'duplicates' in ls/find排除 ls/find 中的“重复项”
【发布时间】:2014-01-27 09:23:18
【问题描述】:

我正在使用一个程序,它以以下格式输出 很多 个输出文件:

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

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

【问题讨论】:

  • 看你的例子很难说。如果您有源线,请提供。
  • 我找到了将 ls 与 sed 和 uniq 相结合的部分解决方案。如果扩展名是'.blah',可以这样做: ls *.blah | sed 's|[0-9]*\.blah|.blah|' | uniq ls 查找所有 blah 文件,sed 删除尾随文件编号,uniq 排除任何生成的重复文件。但是,这不适用于 ls -la,因此无法显示任何文件信息。如果有人有更好的方法,我很想听听!

标签: file find ls


【解决方案1】:

假设只是重复项之间的数字不同,您可以删除它们并将结果输出传递给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]++'

这会从文件名列中删除一个由四个整数组成的序列,并且仅在以前没有见过它时才打印它。

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

【讨论】:

  • 谢谢你,托尔。然而,一个额外的复杂性是文件名可能包含其他数字,这些数字确实可以区分不同的输出文件集,例如:run1_0001.blah、run2_0001.blah 我评论了我在上面找到的一些内容,它类似于这种方法,但使用 sed 代替。不过谢谢:)
  • @JoeTodd:请提供更具代表性的测试数据和预期输出。
  • 非常感谢,Thor,这正是我要找的!
猜你喜欢
  • 1970-01-01
  • 2018-02-02
  • 2019-06-17
  • 2019-08-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 2023-03-10
相关资源
最近更新 更多