如何用Bash脚本遍历子目录并将所有.ptx文件输出到CSV文件?
如何用Bash脚本遍历子目录并将所有.ptx文件输出到CSV文件?
看起来你已经有了一个不错的开头,不过确实需要调整一下来实现递归查找.ptx文件的需求。原来的脚本只能列出当前目录的内容,没办法深入子文件夹,而且没过滤目标文件类型,我们来一步步修改它。
核心思路:用find命令递归查找目标文件
find命令正是处理这类递归文件查找的利器,它可以遍历指定目录下的所有子目录,精准筛选出你需要的文件。
修改后的完整脚本
# 先把路径定义成变量,后续修改月份时更方便 month_dir="/Volumes/NAS/01_PROJECTS/01_SHORTFORM/2024/02_FEB/" csv_filename="AUDIO_BACKUP_LOG_02_FEB.csv" log_target_dir="/Volumes/NAS/04_ADMIN/06_BACKUP_LOGS/MONTHS/2024/" # 检查目标月份目录是否存在 if [ -d "$month_dir" ]; then # 递归查找所有.ptx格式的文件,并输出到CSV # -type f 确保只找文件,排除目录;-name "*.ptx" 精准匹配后缀 find "$month_dir" -type f -name "*.ptx" > "$csv_filename" # 将生成的CSV移动到指定日志目录 mv "$csv_filename" "$log_target_dir" echo "Feb completed" else echo "Error: February directory does not exist" fi
关键部分解释
- 避免
cd操作:直接给find命令指定完整路径,比先cd进去更安全——不用担心脚本运行过程中目录切换导致的路径错误。 - 精准筛选文件:
-type f:确保我们只获取文件,不会把子目录也写到CSV里;-name "*.ptx":只匹配后缀为.ptx的文件,过滤掉其他类型的内容。
- 变量化路径:把目录和文件名存成变量,之后要处理其他月份(比如03_MAR)时,只需要修改
month_dir和csv_filename两个变量即可,不用到处替换字符串,降低出错概率。
可选优化(如果需要更规范的CSV格式)
如果你的文件名里可能包含逗号或者空格(虽然备份文件一般不会,但提前防范总是好的),可以用printf把文件名用引号包裹,确保CSV格式正确:
find "$month_dir" -type f -name "*.ptx" -exec printf '"%s"\n' {} \; > "$csv_filename"
这样每个文件名都会被双引号包裹,避免CSV解析时出错。
备注:内容来源于stack exchange,提问作者LJS
相关产品推荐
相关产品推荐

