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

Bash新手求助:如何在随机子目录下生成处理后的文件

解决Bash遍历子目录处理文件并在同目录生成新文件的问题

你遇到的核心问题是直接用find加重定向时,输出会统一写到当前工作目录的文件里,而非目标子目录。下面提供两种可靠的解决方法:

方法一:用find -exec结合Shell脚本批量处理

这种方法适合一次性处理所有找到的文件,且能正确处理带空格的文件名/目录名:

find inventory -name "list.txt" -type f -exec sh -c '
  # 遍历每个找到的list.txt文件
  for file do
    # 获取当前文件所在的目录路径
    target_dir=$(dirname "$file")
    # 这里替换成你的实际处理命令(示例为提取逗号分隔的第1、3列)
    cut -d"," -f1,3 "$file" > "$target_dir/new_file.txt"
  done
' sh {} +

关键说明:

  • {} +会把所有匹配的list.txt文件批量传给后面的Shell脚本,效率比{} \;更高
  • dirname "$file"精准获取当前文件的父目录,确保新文件生成在对应product_names子目录下
  • 所有变量用双引号包裹,避免文件名含空格时出现错误

方法二:用while循环逐文件处理

如果需要更直观的分步逻辑,可以用管道配合while循环:

find inventory -name "list.txt" -type f | while read -r file; do
  target_dir=$(dirname "$file")
  # 替换为你的实际处理命令,示例为提取冒号分隔的第2列
  cut -d":" -f2 "$file" > "$target_dir/new_file.txt"
done

注意事项:

  • read -r避免反斜杠被转义,保证路径解析正确
  • 同样要给变量加双引号,处理特殊字符路径

为什么之前的重定向会出错?

如果你之前用类似find ... -exec cut ... > new_file.txt的命令,重定向操作是由当前终端的Shell执行的,而非find启动的cut进程,所以所有输出都会被写入当前工作目录的new_file.txt,而不是每个子目录下。必须针对每个文件单独确定目标目录,再执行重定向。

新手测试小技巧

正式执行前,可以把重定向改成echo,先验证目标路径是否正确:

find inventory -name "list.txt" -type f -exec sh -c '
  for file do
    target_dir=$(dirname "$file")
    echo "将生成文件:$target_dir/new_file.txt"
  done
' sh {} +

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:55:31