【问题标题】:Sed/bash to append partial filename and date to new filename in bashSed/bash 将部分文件名和日期附加到 bash 中的新文件名
【发布时间】:2015-02-03 18:24:39
【问题描述】:

我在一个文件夹中有一堆 csv 文件。我需要一个 sed/bash 脚本来为文件夹中的每个文件完成以下操作:

获取 filename.csv,对每个文件执行一个脚本,并将执行结果粘贴到 filename+CurrentDate.csv 中,其中当前日期只是没有空格的日期。

例如: abc.csv 执行一个函数后变成 abc_02-03-15.csv。

我认为代码看起来像这样:

#!/bin/bash
dir="/var/tmp/"
now=$(date)
for f in "$dir"/*; do
   ScriptName
   sed OriginalFileName > "OriginalFileName+$now.csv" 
done

请提前告知并感谢您的帮助。

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    假设您的过滤脚本在标准输入上接受输入并写入标准输出:

    dir="/var/tmp/"
    now=$(date "+%Y-%m-%d")
    for f in "$dir"/*; do
       ScriptName <"$f" >"${f}_$now.csv"
    done
    

    应该很明显,在循环中,$f 指的是输入名称。当它被替换为字符串的一部分时,其后的字符是有效的变量名,有必要使用花括号来消除歧义:$f_$now.csv 将寻找一个名为 f_ 的变量,而不是 f

    此处的日期采用 YYYY-MM-DD 格式。这强烈优于 DD-MM-YY 或 MM-DD-YY,原因如下: 987654327@,将显示以这种方式命名的文件(从最新到最旧或从最旧到最新),对于人类读者来说,无论他们来自传统的 DD-MM 或 MM-DD 的国家/地区,这都是明确的。

    【讨论】:

    • 这似乎在 for 循环中起作用。尝试在 for 循环之外执行此操作有点问题。我有一个简单的脚本如下:file1=abc.csv, file2="${file1%.*}", now=$(date), file3=$file1_$file2, echo "$file3"。这仅显示 abc 而不是 abc 后跟日期。
    • 我不太确定你的意思。您能否澄清剩下的问题(或链接到提出的任何新问题,是否超出现有问题的范围)?
    • 基本上我想要做的是在循环之外显示文件+日期。对我之前评论的更正是 file3=$file2_$now。 echo "$file3" 显示 abc 但不显示日期
    • 这不会像给定的那样工作——它需要是file3=${file2}_$now。但是,通过该更正,它运行良好。见ideone.com/qlMfRQ。如果您有一个示例显示此适合您,请以类似的方式提供它 - 使用独立的复制器。
    • 做到了。谢谢查尔斯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2015-02-27
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多