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

Unix下基于文件分隔符前缀创建目录并复制对应文件的方法

解决Unix环境下按目录归类文件的问题

这事儿在Unix环境下很容易搞定,我给你两种实用方案,不管是小文件列表还是大体积的文件清单都能轻松处理:

方案一:Bash循环(直观易读,适合新手)

这种方式逻辑清晰,每一步都明明白白,适合需要理解过程或者处理特殊场景的情况:

#!/bin/bash
# 替换成你的实际文件名,比如你的文件叫file_paths.txt
INPUT_FILE="file_list.txt"

# 用|作为分隔符读取每一行
while IFS='|' read -r target_dir file_path; do
    # -p 参数确保目录不存在时自动创建,已存在时不会报错
    mkdir -p "$target_dir"
    # 提取文件名并复制到目标目录
    cp "$file_path" "$target_dir/$(basename "$file_path")"
done < "$INPUT_FILE"

关键细节说明:

  • IFS='|':指定读取行时的分隔符,如果你的文件用其他分隔符(比如逗号、制表符),直接替换这里的字符即可
  • read -r target_dir file_path:把每行按分隔符拆分成目录名和文件路径两个变量
  • mkdir -p:避免目录已存在时抛出错误,同时如果有嵌套目录也能一次性创建(不过你的场景里目录都是单层的,这个参数依然实用)
  • basename "$file_path":提取文件的纯文件名,确保复制到目录里的是文件名而不是完整路径

方案二:Awk + Xargs(高效快速,适合大文件)

如果你的文件列表非常大,这种方式的执行效率会比循环更高,因为减少了进程创建的开销:

# 同样替换成你的实际文件名
INPUT_FILE="file_list.txt"

awk -F'|' '{print $1, $2}' "$INPUT_FILE" | xargs -n2 sh -c 'mkdir -p "$0" && cp "$1" "$0/$(basename "$1")"'

关键细节说明:

  • awk -F'|' '{print $1, $2}':用|分隔每行,输出目录名和文件路径两个字段
  • xargs -n2:每次从管道读取两个参数,分别传给后面的sh命令
  • sh -c '...':把收到的两个参数($0是目录名,$1是文件路径)用于创建目录和复制操作

通用注意事项:

  • 如果你的文件名或目录名包含空格、特殊字符(比如&、*),上面的脚本都用双引号包裹了变量,能完美处理这种情况
  • 如果你需要移动文件而不是复制,把cp换成mv即可
  • 执行脚本前可以先加上echo测试,比如把mkdir -p换成echo mkdir -p,cp换成echo cp,先确认命令是否符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:24:14