如何使用find操作多个文件名?

如何使用find操作多个文件名?

如何改进以下命令以更改文件名中的字符串。

find . -type f -name '*<today>*' -exec mv {} {}_renamed \;

实际上,我的目录中有一些文件,名称中包含今天的日期。我想更改所有文件的名称,以便只有文件名中的日期字符串将从今天的日期更改为昨天的日期。

我不想在文件名中添加后缀或前缀,而是操纵文件名。

例如,
命令文件名之前是xxx20170821yyyy.ppp
命令文件名之后xxx20170820yyyy.ppp

并对名称中包含字符串的所有文件重复此操作20170821

答案1

用作renamePerl 命令的一部分。

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,由于您使用的是cshshell,因此您需要使用`...`代替$(...),或者最好切换到新的 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"`/" '{}' \;

相关内容