我有几组文件(几百个)。在每个集合中,每个文件都与以文件名编码的日期(年/月/日)相关。我想执行一个命令,该命令从特定日期的每个集合中输入文件。 由于某些集合中的文件有时会丢失,因此我只想在所有集合包含特定日期的文件时启动该命令。
我想知道是否有任何现有的(命令行或其他)工具可以做这种事情。我搜索但我找不到任何东西。 使用日期作为文件的密钥不是强制性的。我想任何足够通用的工具都会提供一种将键指定为参数的方法。
编辑:
少于10套,但每套包含数百个文件。
每个集都位于一个单独的目录中。
答案 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.txt
和boom20140112/b.txt
形成一组,foo20140111/a.txt
和foo20140111/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.txt
和tags/tags_(date)_b.txt
和input/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