我需要添加文件的创建日期和文件名。例如,如果文件 Test 的创建日期是 2017 年 3 月 22 日,那么我需要将其更改为 test_rbc_22032017。我能够对单个文件执行操作,但不确定如何创建脚本来更改给定目录中 n 个文件的名称。我尝试了以下但没有运气
for f in /path ; do mv -n ""$f"_RBS_(date -r "$f" +"%Y%M%D")"; done
但没有运气。请提出一个解决方案
答案1
您的命令有一些问题:
for f in /path ; do mv -n ""$f"_RBS_(date -r "$f" +"%Y%M%D")"; done
for f in /path
只会循环一次(使用f
=/path
)。您可能想要for f in /path/*
考虑/path/
目录中的每个文件(如果您想考虑子目录中的文件,那就是另一个问题了)。mv
需要两个参数。来源显然是"$f"
。目的地需要是转换后的名称。您错过了命令替换
$
中的内容$(...)
。的格式字符串与
date
您的描述不符(您可能需要月份和日期,而不是分钟和短日期)您使用的是修改日期,而不是创建日期(在大多数文件系统类型上不会保留创建日期)。我将保持原样。
您的描述暗示您希望文件名采用小写。
修正上述内容后(除了选择使用哪个日期之外),我们最终得到
for f in /path/* ; do mv -n "$f" "${f,,}_rbc_$(date -r "$f" +'%d%m%Y')"; done
另一件需要考虑的事情是,如果您在同一位置多次执行此操作,您可能需要将文件移动到不同的目录或测试它们是否已经具有合理的后缀(在添加新的后缀之前将其删除)一个,或者只是保留这些文件不变)。
答案2
第一件事是该mv
命令需要源和目标,您只需提供一个。
接下来是日期格式,根据您的信息,您想要 %Y 代表年份,%m 代表月份,%d 代表日期,请参阅 参考资料 中man date
序列之间差异的解释。
第三点是您只提供路径 ( for f in /path
) 而不是引用文件 ( for f in /path/*
)。所以一个有效的例子是:
for f in /path/*; do mv -n "$f" "${f}_$(date -r "$f" +'%Y%m%d')"; done
答案3
尝试这种操作,并根据您的情况进行调整:
now=$(date +"%m_%d_%Y") file="/nas/backup_$now.sql"
所以应该有效:for f in /path ; do mv -n "$f" "${f}_RBS_$(date +"%m_%d_%Y")"; done
答案4
这是最好的方法。
以下脚本用于为给定目录中的 n 个文件添加文件的创建日期。
#!/bin/bash
path="/home/modassir/data/"
listoffiles=$(ls -1 /home/modassir/data)
for f in $listoffiles; do
file=$(date -r $path$f +'%d%m%Y-%H:%M:%S')
mv $path''$f'' $path''$f''_rbc_''$file''
done;
/home/modassir/data
是目录名