在Bash脚本中批量移动或重命名文件 - 附加日期作为后缀

4

经过多次搜索和尝试,我无法批量对目录中的文件进行mvrename。我想要做的是移动或重命名目录中的所有文件,以便将$date(+“%Y%d%m”)添加到原始后缀的mvrename文件中。

所有原始文件都具有唯一的前缀,但是它们可以是.xml.txt,因此我希望从org_prefix.org_suffix -> org_prefix.org_suffix.DATE

我已经尝试了以下方法:

$ mv /directory/* /directory/*$(date (+ '%Y%m%d') 

但总是遇到/directory/*.actualdate' 不是目录错误。

我尝试了以下方法:

$ for f in *; do mv $ $f.$(date +'_%m%d%y'); done 

但是我收到了错误消息:mv:无法对'$'进行状态检查;没有那个文件或目录

最后,我甚至尝试了这个方法:

$ rename 's/*/.test/' * 

只是想尝试将所有文件更改为org_prefix.test,但没有任何反应(没有错误,什么都没有)。

非常感谢您的帮助。

2个回答

5

在当前目录中循环遍历文件(例如,打印文件名)的正确方式为:

for file in *; do
    echo "$file"
done

您将如何添加日期?当然,可以像这样使用:
for file in *; do
    echo "$file.$(date +%Y%m%d)"
done

当然,你会如何进行搬迁呢?就像这样:
for file in *; do
    mv -nv -- "$file" "$file.$(date +%Y%m%d)"
done

我已添加:
  • -v 参数,让 mv 命令输出详细信息(我想知道程序正在执行什么操作,而且总是会让我的妹妹惊叹于屏幕上的所有这些行)。
  • -n 参数,以防覆盖一个已经存在的文件。安全第一。
  • -- 参数,以防文件名以连字符开头: 如果没有 --mv 命令会将其解释为选项。安全第一。

如果您只想查看扩展名为 .banana 的文件,请使用以下代码替换 for 循环:

for file in *.banana; do

搜索包含单词“香蕉”的文件:
for file in *banana*; do

请继续跟上技术发展!

跟上香蕉的节奏!


谢谢,这个方法也很有效。如果我想把它放在bash脚本中,并从cron作业中调用,正确的语法是:for file in /some_directory/*; do mv -nv -- "$file" "/new_directory$file$(date +%Y%m%d)" done - user2755742
如果从cronjob中调用它,则不需要-v开关,除非您想记录此输出。除此之外一切都很好!(在将其放入crontable之前,请尝试运行脚本以检查是否一切正常)。 - gniourf_gniourf

1
$ mv /directory/* /directory/*$(date (+ '%Y%m%d')

这不起作用,因为*会扩展为所有文件的列表,所以在扩展后,命令将变成以下内容:
mv /directory/file1 /directory/file2 /directory/file3 /directory/file1_date /directory/file1_date ...

所以你指定了许多目标,但是mv的语法只允许一个单一的目标。

for f in *; do mv $ $f.$(date +'_%m%d%y'); done

您在$后面忘记了f,导致出现了错误信息。

for f in *; do mv $f $f.$(date +'%m%d%y'); done

我认为现在这应该可以工作了,但别忘了引用所有变量!
最后:
for f in *; do mv "$f" "$f.$(date +'%m%d%y')"; done

编辑:当变量后面直接跟着字符时,最好使用{}来明确表明它们不是变量名的一部分。
for f in *; do mv "$f" "${f}.$(date +'%m%d%y')"; done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接