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
相关产品推荐
相关产品推荐

