如何改进以下命令以更改文件名中的字符串。
find . -type f -name '*<today>*' -exec mv {} {}_renamed \;
实际上,我的目录中有一些文件,名称中包含今天的日期。我想更改所有文件的名称,以便只有文件名中的日期字符串将从今天的日期更改为昨天的日期。
我不想在文件名中添加后缀或前缀,而是操纵文件名。
例如,
命令文件名之前是xxx20170821yyyy.ppp
命令文件名之后xxx20170820yyyy.ppp
并对名称中包含字符串的所有文件重复此操作20170821
。
答案1
用作rename
Perl 命令的一部分。
find . -type f -name '*20170919*' -execdir
rename -n 's/20170919/20170918/' '{}' \;
在执行其部分命令时使用execdir
,以针对在返回的相对路径中找到的文件运行execdir
。这将防止传递文件的完整路径(相对于当前工作目录)并避免使用相同的文件夹图案重命名错误而不是文件名本身。
如果所有文件都在单个目录中,则下面一行rename
就足够了。
rename -n 's/20170919/20170918/' *20170919*
-n
当您相信重命名结果具有实际重命名时,请删除。您可能需要添加-v
才能看到正在重命名的内容。
最后,如果您希望每天对一堆文件执行此操作,您可能需要有今天的日期。然后在双引号之间使用date
以下命令$(...)
(命令替换)。
find . -type f -name "*$(date +"%Y%m%d")*" -execdir
rename -n "s/$(date +"%Y%m%d")/$(date -d "-1day" +"%Y%m%d")/" '{}' \;
Ps,由于您使用的是csh
shell,因此您需要使用`...`
代替$(...)
,或者最好切换到新的 shell,例如bash
, zsh
。
find ./ -type f -name "*`date +"%Y%m%d"`*" -execdir
rename -n "s/`date +"%Y%m%d"`/`date -d "-1day" +"%Y%m%d"`/" '{}' \;