从多级子文件夹提取文本文件:解决同名文件覆盖问题及优化方案问询
解决同名文件覆盖问题 & 更高效的文本合并方案
一、修改脚本避免同名文件覆盖
你之前的脚本遇到同名文件覆盖的问题,核心原因是直接将所有.txt文件复制到同一目录却未修改文件名。我们可以将文件的相对路径转换为文件名的一部分(比如把路径中的/替换成_),确保每个文件的新文件名唯一。
这里有个兼容空格、特殊字符的安全版本脚本:
# 确保目标目录存在(-p参数避免重复创建报错) mkdir -p target_directory # 遍历所有.txt文件,处理文件名后复制 find . -type f -name "*.txt" -print0 | while IFS= read -r -d '' file; do # 把文件的相对路径中的斜杠替换成下划线,生成唯一文件名 new_filename=$(echo "$file" | tr '/' '_') # 复制文件到目标目录,使用新文件名 cp "$file" "target_directory/$new_filename" done # 合并所有文件(和你原来的步骤一致) cd target_directory cat *.txt > all-info rm *.txt
find ... -print0和read -r -d ''是为了兼容文件名包含空格、特殊字符的场景,避免脚本出错;tr '/' '_'将路径中的/替换为_,比如subdir1/subdir2/file.txt会变成subdir1_subdir2_file.txt,保证文件名绝对唯一。
二、更高效的文本合并方案
其实你完全可以跳过复制文件这一步,直接遍历所有.txt文件并将内容追加到目标文件中,这样既节省磁盘空间,又减少IO操作,效率提升明显:
# 创建目标目录并进入 mkdir -p target_directory cd target_directory # 直接遍历所有.txt文件,将内容合并到all-info中 find .. -type f -name "*.txt" -print0 | while IFS= read -r -d '' file; do # 可选:添加文件路径作为分隔标记,方便后续区分不同文件的内容 echo "--- Content from: $file ---" >> all-info # 将当前文件内容追加到all-info cat "$file" >> all-info # 可选:添加空行分隔不同文件的内容,提升可读性 echo "" >> all-info done
这个方案不需要复制任何文件,直接读取原文件内容并合并,适合文件数量多、体积大的场景,能显著减少处理时间和磁盘占用。
内容的提问来源于stack exchange,提问作者vmicrobio




