Bash脚本如何按文件名前缀搜索子目录文件并批量复制
问题原因
- 路径配置错误:你脚本中写的
~/name.txt和~/OUTPUTDIR指向当前用户的家目录,和你描述的「与当前工作目录同级」的路径要求不符,首先无法读取到正确的前缀列表,其次输出目录路径也不匹配。 - 搜索范围错误:原有脚本仅在脚本执行的当前目录下搜索匹配前缀的文件,没有进入指定的源目录递归遍历所有子文件夹,自然找不到存放在源目录子目录内的目标文件。
- 通配符展开异常:直接拼接
"$file"*的写法如果当前目录下没有匹配文件,通配符*会被当作普通字符串传递给cp命令,就会出现你看到的cannot stat 'xxx*'报错。
修正后的脚本
#!/bin/env bash # 请根据你的实际文件名修改下方三个变量的取值 NAME_FILE="../name.txt" # 前缀列表文件,和当前工作目录同级则前缀加../ SOURCE_DIR="../source_dir" # 替换为实际的源目录名称 OUTPUT_DIR="../output_dir" # 替换为实际的输出目录名称 # 自动创建输出目录,避免目录不存在报错 mkdir -p "$OUTPUT_DIR" # 逐行读取前缀列表,兼容含空格/空行的前缀文件 while IFS= read -r prefix || [ -n "$prefix" ]; do # 跳过空行 [ -z "$prefix" ] && continue # 递归搜索源目录下所有匹配前缀的文件,复制到输出目录 find "$SOURCE_DIR" -type f -name "${prefix}*" -exec cp {} "$OUTPUT_DIR"/ \; done < "$NAME_FILE"
可选优化
- 如果存在重名文件不想覆盖,可将
cp改为cp -n,-n参数会自动跳过已存在的重名文件。 - 如果需要保留源文件的目录层级结构,可将
cp改为cp --parents,会在输出目录下自动重建原文件的父目录结构。
内容的提问来源于stack exchange,提问作者Lou_A
相关产品推荐
相关产品推荐

