使用find命令为文件前缀加时间戳重命名报错、后缀添加正常原因问询
问题核心原因
两个命令的执行差异完全来自find返回路径的格式特性:
find . -type f返回的所有匹配文件路径都自带./前缀(代表当前目录),例如你当前目录下的test.txt,在-exec参数中{}占位符实际替换后的值为./test.txt- 执行前缀拼接命令时,目标路径
$(date +%Y-%m-%d)_{}替换后会变为2024-XX-XX_./test.txt,系统会将该路径解析为「找到当前目录下名为2024-XX-XX_.的子目录,将文件移动到该目录下并命名为test.txt」,这个子目录默认不存在,自然会报找不到文件/目录的错误 - 执行后缀追加命令时,目标路径
{}.$(date +%Y-%m-%d)替换后会变为./test.txt.2024-XX-XX,路径完全合法,就是当前目录下的新文件名,所以可以正常执行
正确的文件名前缀拼接方案
如果要实现给文件名前加时间戳的需求,需要先剥离路径前缀再拼接,再还原路径位置,正确命令如下:
# 递归处理当前目录及所有子目录下的文件 find . -type f -exec sh -c 'mv "$0" "$(dirname "$0")/$(date +%Y-%m-%d)_$(basename "$0")"' {} \;
如果只需要处理当前一级目录的文件,不需要递归子目录,可以加上-maxdepth 1参数简化写法:
# 仅处理当前目录下的文件,不遍历子目录 find . -maxdepth 1 -type f -exec sh -c 'mv "$0" "$(date +%Y-%m-%d)_$(basename "$0")"' {} \;
内容的提问来源于stack exchange,提问作者Raghava Ch
相关产品推荐
相关产品推荐

