You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:20:59