【问题标题】:Add file date to file name in bash在bash中将文件日期添加到文件名
【发布时间】:2016-02-14 04:03:09
【问题描述】:

我正在寻找一种将文件日期添加到文件名的编程方式。我在 Mac 上,Yosemite (10.10)。

使用 Bash,我为此付出了相当多的努力,但到目前为止还太新了。这是我目前所拥有的:

#!/bin/bash

#!/bin/bash

(IFS='
'
for x in `ls -l | awk '{print$9" "$7"-"$6"-"$9}'`
do 
    currentfilename=$(expr "$x" : '\($substring\)')
    filenamewithdate=$(expr "$x" : '.*\($substring\)')
    echo "$currentfilename"
    echo "$filenamewithdate"
done)

这里的想法是捕获详细的 ls 输出,使用 awk 捕获具有文件名 ($9) 的列的字符串,以及日期字段 ($7 和 $6),然后循环该输出以捕获以前的文件名和新的带有日期的文件名将文件从旧文件名转换为新文件名。 awk 语句添加了一个空格来分隔当前文件名和新文件名。 echo 语句现在可以测试我是否能够解析 awk 输出。我只是不知道要为 $substring 添加什么来获取所需的字符串部分。

我还有很多关于 Bash 脚本的知识要学习,所以我希望你能在我学习的过程中多多包涵。有什么指导吗?

谢谢。

【问题讨论】:

  • 对于初学者,如果你不知道如何使用man programOfInterest,你需要。然后,使用man stat。您应该能够使用statprintf 选项构建一个更好的日期文件名。您对for x in ls ... 的使用应替换为for f in *; do newFName=$(stat "$f" ...opts to stat) ; ....; done。不要在 for 循环中使用ls,这是一个不好的习惯。如果换一种方式,这会让你思考你的问题。更新您的 Q 或删除此问题并发布新 Q 以帮助澄清您的问题。祝你好运。
  • 详细说明@shelter 的评论:不要将ls 输出用于任何事情。 ls 是一个交互式查看目录元数据的工具。用代码解析ls 输出的任何尝试都被破坏了。 Globs 更加简单和正确:阅读Parsing ls
  • 如果您在 Yosemite 上编码,请不要使用 linux 标签。我没有 Mac,所以stat 可能不可用(我希望不会!)。如果没有,您的awk 代码将需要允许文件日期超过六个月的情况,其中$8 的值会随着时间戳更改为年份值。祝你好运。
  • 最后,您的文件中不需要两行 #!/bin/bash 并且 $substring 似乎没有在文件中的任何位置定义。祝你好运!

标签: macos bash awk


【解决方案1】:

看看stat man page,你会想要:

for file in *; do
    filedate=$(stat -t '%Y-%m-%dT%H:%M:%S' -f '%m' "$file")
    newfile="$file-$filedate"
    echo "current: $file -> new: $newfile"
done

根据您的喜好调整您喜欢的日期时间格式。

你可以保存一行

for file in *; do
    newfile=$(stat -t '%Y-%m-%dT%H:%M:%S' -f '%N-%m' "$file")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多