【问题标题】:Linux/Bash - Create Loop for "find" to output to a fileLinux/Bash - 为“查找”创建循环以输出到文件
【发布时间】:2015-02-02 21:54:23
【问题描述】:

抱歉,如果这个问题已经得到解答,我对 Linux 有点陌生,但我没有看到任何目标。

不管怎样,我正在运行这个命令:

find 2013-12-28 -name '*.gz' | xargs zcat | gzip > /fast/me/2013-12-28.csv.gz

问题是我需要为大约 250 个不同的日期运行此命令,因此一次执行此命令非常乏味。

我想要做的是有一个脚本,它将在“查找”之后和文件名中将日期增加 1 天。我什至不知道这会是什么样子,使用什么命令等等。

背景:

find 命令正在一个文件夹中使用,其中包含 1 天的数据。每天的文件夹包含 24 个子文件夹,每个子文件夹包含大约 100 个 gzip 压缩的 CSV 文件。所以 find 命令是从文件夹向上 2 层所必需的,因为它会扫描每个文件夹以组合所有数据。最终结果是将所有压缩文件合并为 1 个大压缩文件。

如果有人能提供帮助,我们将不胜感激,否则我还有大约 250 个命令要执行,这显然会很糟糕。

【问题讨论】:

  • 这些顶级文件夹的名称中是否包含日期?这会让事情变得更容易。
  • 嗨,eigenchris,是的。
  • 嗨,eigenchris,是的,顶级文件夹都命名为“2014-01-01”、“2014-01-02”等。子文件夹命名为“0-0”、“0 -1”、“0-2”等。实际文件看起来像“00:00:00.csv.gz”、“00:05:00.csv.gz”、“00:10:00.csv”。 gz”等
  • 实际上是否有日期被遗漏(排除)?

标签: linux bash loops for-loop while-loop


【解决方案1】:

这样的事情呢?

prev_date="2013-12-28"
for i in {0..250}; do
    next_date=$(date -d"$prev_date +1 day" +%Y-%m-%d)
    prev_date=$next_date
    find $next_date -name '*.gz' | xargs zcat | gzip > /fast/me/$next_date.csv.gz
done

它应该遍历 250 个日期,例如:

2014-08-27
2014-08-28
2014-08-29
2014-08-30
2014-08-31
2014-09-01
2014-09-02
2014-09-03
2014-09-04
2014-09-05

【讨论】:

  • 嗯,它使文件正常,但似乎没有正确执行 find 命令。输出文件应该在 500 MB 到 1.5 GB 之间,但它生成的文件是空的。
  • 谢谢你!很棒的东西:)
  • 好的,成功了!非常感谢!我只需要删除 $next_date 周围第 4 行中的引号
【解决方案2】:

如果日期是连续的,jmunsch 的解决方案效果很好。否则你可以这样做:

(已编辑以用冒号替换破折号)

for folderName in $(find . -type d -mindepth 1 -maxdepth 1 )
do
   date=$(basename $folderName)
   dateWithColons=$(echo $date | sed "s#-#:#g")  # this will replace - with :
   find "$folderName" -name '*.gz' | xargs zcat | gzip > /fast/me/$dateWithColons.csv.gz
done

【讨论】:

  • 太棒了,谢谢大家的帮助,我真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
相关资源
最近更新 更多