【问题标题】:Bash - File name change Date + 1Bash - 文件名更改日期 + 1
【发布时间】:2016-04-10 11:52:56
【问题描述】:

我有大约 500 个文件需要用报告所代表的日期重命名。文件名目前是:

WUSR1453722998383.csv
WUSR1453723010659.csv
WUSR1453723023497.csv

等等。文件名中的数字与日期无关,因此我不能将文件名用作文件应重命名为的指南。报告从 2014 年 2 月 12 日开始,直到昨天(2016 年 9 月 4 日),每个月的每一天都有一个报告。幸运的是,文件名是连续的 - 所以 04/12/2014 的数字将高于 03/12/2014,而 03/12/2014 的数字将高于 02/12/2014。这意味着文件会自动按字母顺序列出。

但是,CSV 的第一行数据之前有一个日期:

As at Date,2014-12-02

现在我已经检查了我是否已经拥有所有文件并且我已经拥有了,那么将那里重命名为日期的最佳方法是什么?我可以将开始日期设置为 02/12/2014 并将每个文件重命名为 +1 日期,或者脚本可以读取文件第一行的日期(例如As at Date,2014-12-02)并使用该日期重命名文件。

我不知道如何在 bash 中编写上述任何一种方法,因此,如果您能对此提供帮助,将不胜感激。

在文件输出方面,我希望:

02-12-2014.csv 03-12-2014.csv

等等

【问题讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。您还希望文件按日期顺序列出吗?所以使用像WUSR-2014-02-12.csv(或者WUSR-20140212.csv)这样的名字会给你名字中的日期吗?您应该将所需的输出(最终文件名)添加到您的问题中(您可以编辑您的问题)。您需要保留原始号码吗?您如何检查是否拥有所有文件?无论您做什么,都应该让您了解如何在 shell 脚本中获取所需的信息。你试过什么?
  • 我使用过:head -q -n 1 *.csv > output.csv 来检查我是否拥有所有文件(我使用了输出 CSV 并将其与 02/12 的每个日期进行匹配/2014 到昨天,它们都在那里)。我假设我也可以使用类似的东西来重命名文件(它需要每个 CSV 的第一行并使用那里的日期来重命名文件),我只是不知道如何将它们完全绑定在一起。 ..
  • 我不明白为什么人们喜欢订购的文件,以便 2014 年 2 月 14 日的文件之后是 2015 年 2 月 14 日和 2016 年 2 月 14 日的文件,然后是 2014 年 2 月 15 日、2015 年 2 月 15 日、15 日的文件2016 年 2 月等。然而,这是一个常见问题 - 肯定有一些原因,但我敢肯定这主要是潜意识的。
  • 如果您正在处理 Access,它在输入字母数据时表现得更好,而不必指定您要查找的日期:)
  • 我强烈建议您坚持使用 Y-m-d 格式的文件名:这将按正确的时间顺序显示

标签: bash rename


【解决方案1】:

这是您需要的答案吗?假设所有文件都在当前目录下。在进行实际操作之前进行一些测试。条件是 cvs 文件中的每个日期字符串都是唯一的。否则会有一些文件被覆盖。

#!/bin/bash
for f in *.csv
do 
    o=$(sed '1q' $f |awk -F"[,-]" '{print $NF"-"$(NF-1)"-"$(NF-2)".csv"}')
    # should we backup the file?
    # cp $f ${f}.bak
    mv $f $o
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2021-07-17
    相关资源
    最近更新 更多