【问题标题】:Bash Loop to rename files with spaces and dates in human formatBash Loop 以人类格式重命名带有空格和日期的文件
【发布时间】:2017-06-11 03:19:07
【问题描述】:

我有很多名为“Mon, May 22, 2017.log”的日志文件,我希望将它们重命名为典型的日期格式 (yyyy-mm-dd.log)。现在我会非常乐意接受 yyyy-mmm-dd.log。有什么想法吗?

【问题讨论】:

  • 使用date命令解析它们,然后以你想要的格式打印日期。
  • SO 不是免费的编码服务。您必须自己尝试解决问题。如果您无法使其正常工作,请发布您尝试过的内容,我们会帮助您解决问题。

标签: bash


【解决方案1】:

这样的事情应该可以工作:

for i in *.log; do mv "$i" "$(awk -F '[\ ,.]' '{print $6 "-" $3 "-" $4}' <<< "$i")".log;done

当然,对使用的日期格式进行更深入的解析会更好。

【讨论】:

  • 这里缺少一堆引号。通过shellcheck.net 运行它并修复它找到的内容。
  • (另外,这真的很低效,每个文件名运行一次awk——如果我自己写这个,我会用正则表达式匹配本地 bash 中的名称,从而避免所有开销为命令替换生成一个子shell,创建一个临时文件来保存herestring,执行一个外部进程,其标准输入连接到该临时文件,等等)。
  • 引号很好,因为输出不会产生任何空格。当然,您对效率的看法是正确的,但我不担心日志文件不会那么多,以每天一个的速度。
  • 你不知道它不会生成空格——你的 awk 表达式只吐在空格上;如果输入文件名有制表符,它们可能会出现在输出中。
  • 无论输入定义得多么好——编写在未满足预期先决条件时以意想不到的方式运行的软件(与正确处理或优雅的错误检测和退出相反)是很重要的为什么理论与实践之间的分歧如此令人不快。我曾经看到一个案例,其中用于计费数据的多 TB 记录被删除,因为有人没有引用他们的脚本(并且一个单独的软件中的一个错误在该脚本的输入目录中生成了一个“不可能的”文件名)。
【解决方案2】:

在您选择的文件夹中,您可以尝试以下操作:

for file in *.log; do filename=${file%%.*};convertedDate=$(date -d"$filename" +%Y-%m-%d) && mv "$file" "$convertedDate.log"; done

【讨论】:

  • IFS=$'\n' 不能替代正确的引用。文件名中可以​​使用文字换行符。
  • 您可以删除 IFS 修改并将您的 if 块替换为 复合表达式,例如convertedDate=$(date -d "$filename" +%Y-%m-%d) &amp;&amp; mv "$file" "$convertedDate.log"
  • 我编辑了我的答案。谢谢两位的建议。
【解决方案3】:

所以我尝试了几个不同的想法,但最终制作了一个实际上对我更有效的小脚本,因为除了重命名我之外,我还需要做很多其他事情来清理我的文件。

脚本是:

FILENAME=$(basename "$1")
FILENAME="${FILENAME%.*}"
NEWNAME=$(date -d "$FILENAME" +%Y%m%d)
mv "$1" "$NEWNAME".log

然后我使用以下命令运行脚本:

find . -iname "*.log" -exec ./test.sh {} \;

可能不是最优雅或最有效的答案,但它确实有效。

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 2017-02-25
    • 2011-04-27
    • 2010-11-16
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多