用于在具有相同日期的文件上启动命令的工具

时间:2014-01-12 07:25:48

标签: bash command

我有几组文件(几百个)。在每个集合中,每个文件都与以文件名编码的日期(年/月/日)相关。我想执行一个命令,该命令从特定日期的每个集合中输入文件。 由于某些集合中的文件有时会丢失,因此我只想在所有集合包含特定日期的文件时启动该命令。

我想知道是否有任何现有的(命令行或其他)工具可以做这种事情。我搜索但我找不到任何东西。 使用日期作为文件的密钥不是强制性的。我想任何足够通用的工具都会提供一种将键指定为参数的方法。

编辑:

  • 少于10套,但每套包含数百个文件。

  • 每个集都位于一个单独的目录中。

2 个答案:

答案 0 :(得分:0)

由于这个答案用bash标记,这里有一个bash脚本来检查一个文件是否存在,在每个给定的集合中是否包含一些日期字符串(作为脚本的第一个参数提供)。如果它存在于每个中,则执行some_command:

#!/bin/bash
datestr=$1
all_exist=Y
for set in dir1 dir2 dir3 dir4
do
    [ -f "$set/"*"$datestr"* ] || all_exist=""
done
[ "$all_exist" ] && some_command

答案 1 :(得分:0)

所以这可以分为两个任务:

  • 查找集合存在的日期
  • 在每个集合上启动命令

您没有透露文件的组织方式,但如果您有boom20140112/a.txtboom20140112/b.txt形成一组,foo20140111/a.txtfoo20140111/c.txt另一组,您可以找到日期

dates () {
    printf "%s\n" *201[0-9][0-9][0-9][0-9][0-9]/. |
    sed -e 's%^[0-9]*%%' -e 's%/\.$%%' |
    sort -u
}

如果您的设置看起来不同,您可以调整它。一般的想法是获取相关文件名列表,去掉不是日期的部分,并删除任何重复。现在你有了一个日期列表。

这是另一个实现,它假设您有一个名为tags/tags_(date)_a.txttags/tags_(date)_b.txtinput/samples_(date).txt的文件,每个日期形成一个集合,其中日期格式为2014-01-12。

dates () {
    printf "%s\n" input/* tags/* |
    sed 's/.*_\(201[1-9]-[0-9][0-9]-[0-9][0-9]\)[_.].*/\1/' |
    sort -u
}

鉴于此,循环遍历日期并在每个集合上运行命令。

dates | while read -r date; do
    command *$date/*
done