如何修改Shell脚本实现复制文件夹生成同名空文件并保留时间戳
问题分析
原代码存在3个核心问题:
- 依赖
ls输出遍历文件名,遇到含空格、换行、特殊字符的文件会解析异常 - 生成的文件额外添加了
.txt后缀,与原文件名不一致,不符合需求 - 未给
touch指定时间参考参数,新生成文件默认使用当前系统时间,丢失原文件时间戳
修复后代码
基础版本(仅处理原目录下的文件,不处理子目录)
# 提前创建目标目录,不存在也不会报错 mkdir -p /media/SSD/Folder_Clone # 遍历原目录下所有文件 for file in /media/SSD/Folder/*; do # 仅处理普通文件,跳过子目录 if [ -f "$file" ]; then filename=$(basename -- "$file") # 生成空文件,同时同步原文件的时间戳 touch -r "$file" "/media/SSD/Folder_Clone/$filename" fi done exit
递归版本(保留原目录的子目录结构)
如果原目录存在多层子目录需要同步结构,使用以下版本:
mkdir -p /media/SSD/Folder_Clone # 递归遍历所有普通文件,用null分隔避免特殊文件名解析问题 find /media/SSD/Folder -type f -print0 | while IFS= read -r -d '' file; do # 计算文件相对原目录的路径 rel_path="${file#/media/SSD/Folder/}" # 提前创建对应子目录 mkdir -p "/media/SSD/Folder_Clone/$(dirname -- "$rel_path")" # 生成空文件并同步时间戳 touch -r "$file" "/media/SSD/Folder_Clone/$rel_path" done exit
核心修改说明
touch新增-r参数:指定以原文件为时间参考,将原文件的访问时间、修改时间完全同步到新生成的空文件- 移除了原代码中多余的
.txt后缀,保证克隆后的文件名与原文件完全一致 - 替换了不可靠的
ls遍历方式,兼容含特殊字符的文件名 - 新增目录预创建逻辑,避免目标路径不存在导致的报错
内容的提问来源于stack exchange,提问作者Thomas123
相关产品推荐
相关产品推荐

