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

将子目录中无对应.out文件的.txt文件复制到tmp文件夹

筛选无对应.out的.txt文件并复制到tmp目录

这里有两种实用的方法来完成你的需求,不管是当前已知的两个子目录,还是以后扩展更多子目录都能适用:

方法一:递归处理所有子目录(通用版)

如果你的目录结构以后可能新增更多子目录,用这个递归查找的方法最省心:

# 先确保tmp目录存在,避免复制失败
mkdir -p tmp

# 递归查找所有.txt文件,检查对应.out是否存在,不存在则复制
find . -type f -name "*.txt" | while read -r txt_file; do
    # 替换.txt后缀为.out,得到对应的输出文件路径
    out_file="${txt_file%.txt}.out"
    # 如果.out文件不存在,就复制当前.txt到tmp
    if [ ! -f "$out_file" ]; then
        cp "$txt_file" tmp/
        echo "已复制: $txt_file"
    fi
done

代码解释:

  • mkdir -p tmp:-p参数确保即使tmp目录已经存在也不会报错,同时会创建嵌套的父目录(如果需要的话)
  • find . -type f -name "*.txt":从当前目录开始,递归查找所有类型为文件、后缀是.txt的文件
  • ${txt_file%.txt}.out:这是bash的参数扩展语法,去掉文件名末尾的.txt,再加上.out,得到对应的输出文件路径
  • [ ! -f "$out_file" ]:判断这个.out文件是否不存在,如果是就执行复制操作

方法二:针对指定子目录(高效版)

如果确定只有dir1和dir2两个子目录需要处理,用直接遍历的方式会更高效:

mkdir -p tmp

# 遍历指定的子目录
for dir in dir1 dir2; do
    # 遍历当前目录下的所有.txt文件
    for txt_file in "$dir"/*.txt; do
        out_file="${txt_file%.txt}.out"
        # 简化写法:条件满足时执行复制
        [ ! -f "$out_file" ] && cp "$txt_file" tmp/
    done
done

注意事项:

  • 两种方法都用双引号包裹了文件路径,所以即使文件名包含空格、特殊字符(比如!、&)也能正常处理
  • 如果不需要复制时的提示信息,直接去掉echo "已复制: $txt_file"这一行即可

内容的提问来源于stack exchange,提问作者brucezepplin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:42:32