【问题标题】:Set creation date from date in filename从文件名中的日期设置创建日期
【发布时间】:2020-01-01 17:59:34
【问题描述】:

我想创建一个自动化服务来根据文件名中的日期更改文件的创建日期。

文件名:“2014-02-02 Lorem Ipsum.md”或“20190828719 Lorem Ipsum.md”。

如果有一种方法可以将两者都构建到一个服务中,那就太棒了,但两个也可以。不要在意时间,只要约会。

#Note: Filename = "2014-02-02 Lorem Ipsum.md"

$ BASENAME=$(basename $f)
$ TITLE=${BASENAME%.*}

$ echo "$TITLE" | cut -d" " -f1

2014-02-02
Lorem
Ipsum

$ #TOUCH - Something

我假设我将使用某种for f do done 来遍历所有选定的文件。

【问题讨论】:

  • 您说您不关心时间,但可以修改时间时间创建,例如始终将其设置为 00:00 还是要保留原始时间创建?
  • 在一个完美的世界里,应该是这样的: #Case A: 2014-02-02 - 保持原始时间创建 #Case B: 201402021310 - 更新日期和时间 日期绝对是最重要的不过事情。

标签: bash shell automator


【解决方案1】:

您可以使用sed 格式化时间并将其提供给touch

for i in *.md; do 
   touch -d $(sed 's/[^0-9]//g;s/^\(.\{8\}\).*/\1/' <<< "$i") "$i"
done

sed 正则表达式会删除所有非数字字符,只取前 8 个剩余字符。

touch-d 选项将修改时间设置为给定日期。此选项可能是 GNU 特定的选项,在 macosx 系统上不可用。

在 macOS 上,您可以使用命令SetFile(学分:here):

for i in *.md; do 
   SetFile -d $(sed 's/[^0-9]//g;s/\(.\{4\}\)\(.\{2\}\)\(.\{2\}\).*/\1\/\2\/\3 00:00:00/' <<< "$i") "$i"
done

【讨论】:

  • 这几乎可以工作,但它会产生一个奇怪的时间戳。对于这个示例文件,它的时间戳是 2020 年 8 月 14 日。是因为文件名中的日期是 YYYY-MM-DD?非常感谢您的帮助。
  • 它适用于您列出的文件2014-02-02 Lorem Ipsum.md20190828719 Lorem Ipsum.md。你能否请一个命令失败的示例文件?如果其中一个文件失败,请给出结果字符串。
  • 嗯.. 那我一定是做错了什么。我还尝试在终端中运行它以使其尽可能简单。这是我尝试的 20 秒剪辑。此外,-d 告诉我这是一个“非法选项”,所以当我取消它时,它会修改日期并转到 2020 年 8 月 14 日。v.usetapes.com/LeWRhiRi1M
  • @DavidE 我写的命令在 GNU/linux 系统上运行,可能无法在你的 mac 上运行。我用可能的解决方案更新了答案
  • 它工作! for i in *.md; do SetFile -d $(sed 's/[^0-9]//g;s/\(.\{4\}\)\(.\{2\}\)\(.\{2\}\).*/\2\/\3\/\1/' &lt;&lt;&lt; "$i") "$i"; done 获取日期。这很棒。为了学习,我试图修改它以根据时间戳的最后 4 个字符(例如 201909022132)更改小时和分钟。我有麻烦了。这就是我所拥有的:for i in *.md; do SetFile -d $(sed 's/[^0-9]//g;s/\(.\{4\}\)\(.\{2\}\)\(.\{2\}\)\(.\{2\}\)\(.\{2\}\)\(.\{2\}\).*/\2\/\3\/\1\/\4\/\5/' &lt;&lt;&lt; "$i") "$i"; done 结果:“错误:无效的日期/时间”任何指针?非常感谢。
猜你喜欢
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2020-07-18
  • 1970-01-01
相关资源
最近更新 更多