如何递归为文件夹及子文件夹内文件追加最后修改日期至文件名?
递归给文件添加最后修改日期到文件名(保留扩展名)
我完全懂你的痛点——直接用find * -exec mv {} {}_Suffix \;会把后缀硬生生加到扩展名后面,比如photo.jpg变成photo.jpg_Suffix,确实不太合理。我们需要把日期精准插入到文件名主体和扩展名之间,而且要递归处理所有文件,下面给你针对Linux和macOS的两个实用解决方案:
Linux 版本命令
find . -type f -exec sh -c ' for file do # 获取文件最后修改日期,格式化为「YYYYMMDD_HHMMSS」(可按需自定义格式) mod_date=$(stat -c "%Y%m%d_%H%M%S" "$file") # 拆分文件的目录路径、主体名和扩展名 file_dir=$(dirname "$file") file_base=$(basename "$file") file_name="${file_base%.*}" file_ext="${file_base##*.}" # 单独处理无扩展名的文件(比如README这类纯文本文件) if [ "$file_name" = "$file_ext" ]; then new_file="${file_dir}/${file_name}_${mod_date}" else new_file="${file_dir}/${file_name}_${mod_date}.${file_ext}" fi # 执行重命名(第一次测试建议改成 echo mv,避免误操作) mv "$file" "$new_file" done ' sh {} +
macOS 版本命令
macOS的stat命令参数和Linux有差异,所以调整后的命令如下:
find . -type f -exec sh -c ' for file do # macOS下获取格式化后的修改日期 mod_date=$(stat -f "%Sm" -t "%Y%m%d_%H%M%S" "$file") file_dir=$(dirname "$file") file_base=$(basename "$file") file_name="${file_base%.*}" file_ext="${file_base##*.}" if [ "$file_name" = "$file_ext" ]; then new_file="${file_dir}/${file_name}_${mod_date}" else new_file="${file_dir}/${file_name}_${mod_date}.${file_ext}" fi mv "$file" "$new_file" done ' sh {} +
关键细节提示
- 日期格式自定义:你可以修改
%Y%m%d_%H%M%S,比如改成%Y-%m-%d就会得到2024-05-20这种更易读的日期后缀 - 安全测试建议:第一次运行时,把
mv "$file" "$new_file"改成echo mv "$file" "$new_file",这样只会打印要执行的重命名命令,确认格式正确后再改成真正的mv - 避免重复修改:如果担心重复执行命令导致文件名多次追加日期,可以给
find加过滤条件,排除已经带日期后缀的文件:find . -type f ! -name "*_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_*" -exec ...
这样处理后,你的report.pdf会变成report_20240520_143022.pdf,无扩展名的notes会变成notes_20240520_143022,完全符合你的需求!
内容的提问来源于stack exchange,提问作者computationalprince
相关产品推荐
相关产品推荐

