You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从多级子文件夹提取文本文件:解决同名文件覆盖问题及优化方案问询

解决同名文件覆盖问题 & 更高效的文本合并方案

一、修改脚本避免同名文件覆盖

你之前的脚本遇到同名文件覆盖的问题,核心原因是直接将所有.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 ... -print0read -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

火山引擎 最新活动