求批量处理子目录的循环脚本:迁移文件并删除指定子文件夹
批量处理用户目录脚本优化方案
需求场景
现有目录结构如下:
Main_folder
-->DePreter.Jonas
-->Huistaak1-HelloWorld_Jonas.DePreter.s.ua_poging_2019-11-12
--> (文件和子目录名称不限)
-->(其他用户目录名)
-->Huistaa1-HelloWorld_(用户名)...
--> 更多文件
...
需要遍历Main_folder下的每个用户目录(如DePreter.Jonas),将其中以Huistaak1开头的子目录内的所有内容(包括隐藏文件)移动到该用户目录根目录,随后删除这个Huistaak1开头的子目录。目前已有重复的单目录处理脚本,需改为循环实现批量处理。
现有单目录处理脚本
cd DePreter.Jonas mv */* */.* . find . -type d -name "Huistaak1*" -delete cd .. cd Feremans.Len mv */* */.* . find . -type d -name "Huistaak1*" -delete cd .. cd Hofkens.Peter mv */* */.* . find . -type d -name "Huistaak1*" -delete cd .. cd Janssens.Jan mv */* */.* . find . -type d -name "Huistaak1*" -delete cd .. cd Peters.Jolien mv */* */.* . find . -type d -name "Huistaak1*" -delete cd .. cd VanHoof.Sarah mv */* */.* . find . -type d -name "Huistaak1*" -delete cd ..
优化后的批量处理脚本
直接在Main_folder目录下执行以下脚本即可:
# 遍历当前目录下的所有用户子目录 for user_dir in */; do # 进入用户目录,失败则跳过 cd "$user_dir" || continue # 定位所有Huistaak1开头的一级子目录,逐个移动内容 find . -maxdepth 1 -type d -name "Huistaak1*" | while read -r task_dir; do # 移动目录内所有文件(含隐藏文件),忽略无隐藏文件时的报错 mv "$task_dir"/* "$task_dir"/.* . 2>/dev/null done # 删除所有Huistaak1开头的一级子目录 find . -maxdepth 1 -type d -name "Huistaak1*" -delete # 返回上级目录 cd .. done
脚本说明
for user_dir in */;:遍历当前目录下的所有子目录(即用户目录)cd "$user_dir" || continue:进入用户目录,若遇权限不足等问题导致进入失败,直接跳过该目录find . -maxdepth 1 -type d -name "Huistaak1*":仅在当前用户目录下查找一级的Huistaak1开头目录,避免递归查找深层无关目录mv "$task_dir"/* "$task_dir"/.* . 2>/dev/null:移动目标目录下的所有普通文件和隐藏文件到用户目录根目录,2>/dev/null用来屏蔽无隐藏文件时的报错信息find . -maxdepth 1 -type d -name "Huistaak1*" -delete:精准删除用户目录下一级的Huistaak1开头目录
内容的提问来源于stack exchange,提问作者FieldyScop
相关产品推荐
相关产品推荐

