Bash脚本问题:实现文件Dir1→Dir2→Dir3→Dir1的无限循环迁移
Bash 实现文件循环处理流程解决方案
以下是满足需求的完整脚本,同时针对核心问题给出详细解释:
#!/bin/bash # 定义目录路径 dir1="/path/to/origin/directory" dir2="/path/to/destination/directory" dir3="/path/to/watch/directory" # 无限循环执行整个流程 while true; do # 遍历Dir1中的所有文件(每次循环重新扫描,处理新增文件) find "$dir1" -type f | while read -r file; do # 提取纯文件名(去除原路径) filename=$(basename "$file") # 构建Dir2中该文件的完整路径 dest_in_dir2="$dir2/$filename" # 步骤1:将文件移动到Dir2 mv "$file" "$dest_in_dir2" # 步骤2:等待文件从Dir2消失 while [ -f "$dest_in_dir2" ]; do # 每1秒检查一次,避免过度占用CPU sleep 1 done # 步骤3:检查Dir3中是否存在目标文件 file_in_dir3="$dir3/$filename" if [ -f "$file_in_dir3" ]; then # 步骤4:找到则移回Dir1 mv "$file_in_dir3" "$dir1" fi done # 若Dir1暂时无文件,短暂休眠后再扫描 sleep 2 done
核心问题解决说明
1. 检测Dir2中的文件是否消失
使用while [ -f "$dest_in_dir2" ]; do sleep 1; done实现等待逻辑:
-f是Bash内置的文件存在判断条件,只要目标文件还在Dir2,循环就会持续- 加入
sleep 1避免高频检查消耗系统资源,可根据实际需求调整休眠时长
2. 在Dir3中查找并移回文件
- 用
basename "$file"提取纯文件名:原$file是Dir1下的完整路径,文件移到Dir2/Dir3后仅保留文件名,因此需要剥离路径部分 - 拼接Dir3下的文件路径
$dir3/$filename,用[ -f ]判断是否存在,存在则通过mv命令移回Dir1
额外优化说明
- 外层
while true确保整个流程无限循环执行 - 每次循环重新扫描Dir1,能自动处理后续新增到Dir1的文件
- 当Dir1无文件时加入
sleep 2,避免空循环持续占用资源 - 使用
find | while read -r file的方式,能正确处理包含空格、特殊字符的文件名
内容的提问来源于stack exchange,提问作者Chase Westlye
相关产品推荐
相关产品推荐

