【问题标题】:Append date/timestamp to existing files将日期/时间戳附加到现有文件
【发布时间】:2021-08-26 19:04:33
【问题描述】:

目录中的文件很少。我想根据通配符标准查找所有文件,然后通过使用单行命令向其附加日期或时间戳字段来重命名它

示例: foo1.txt foo1.log foo2.txt foo2.log

我想查找所有 .log 文件并通过将日期字段附加到它来重命名它们

预期输出: foo1.txt foo1_20210609.log foo2.txt foo2_20210609.log

【问题讨论】:

    标签: shell unix find rename aix


    【解决方案1】:

    我会在匹配的通配符列表上使用“for”循环,然后使用参数扩展和命令替换来拼接其余部分:

    for file in *.log
    do
      echo mv -- "$file" "${file%.log}_$(date +%Y%m%d).log"
    done
    

    中间的部分分解为:

    • mv -- -- 调用“mv”并明确告诉它没有更多选项;这使我们免受可能以-i 开头的文件名,例如
    • "${file%.log} -- 扩展“$file”变量并从末尾删除“.log”
    • _ -- 只需在我们想要的地方添加下划线
    • $(date +%Y%m%d) -- 调用date 命令并插入结果输出
    • .log -- 只需在末尾添加“.log”部分

    如果您喜欢生成的命令,请删除“回声”。 如果您需要静态时间戳,则只需使用该文本代替整个 $(date ...) 命令替换。

    在您的示例输入中,但使用今天的日期,输出为:

    mv -- foo1.log foo1_20210610.log
    mv -- foo2.log foo2_20210610.log
    

    【讨论】:

      【解决方案2】:
      ls | perl -lne '$date=`date '+%Y%m%d'`; chomp($date); `mv $_ $_$date`;'
      
      1. 文件
      2. 将其通过管道传输到 perl 脚本中
      3. e 选项在行中执行
      4. n 选项将输入分成几行
      5. l 选项为每个添加新行

      反引号执行unix命令

      【讨论】:

      • 当心稀有(但完全合法)文件名,例如“foo bar.log”或$'foo\nbar.log'被ls | ... 错误解析。我认为 OP 还希望限制对“.log”文件的更改,而这里的裸 ls 也会抓取他们的“foo1.txt”文件。
      猜你喜欢
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2011-09-02
      相关资源
      最近更新 更多