【发布时间】: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。您应该能够使用stat的printf选项构建一个更好的日期文件名。您对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似乎没有在文件中的任何位置定义。祝你好运!