Bash脚本迁移目录后find与copy功能失效求助
问题分析与解决
核心问题原因
你的脚本里的find命令没指定搜索起始路径,默认会以脚本执行时的当前工作目录作为搜索起点。当把脚本复制到其他目录执行时,当前工作目录变了,find自然找不到原位置的文件——哪怕你在正确目录单独执行find能找到结果。
修复后的脚本
#!/bin/bash # 检查参数数量 if [ "$#" -ne 2 ]; then echo "ARGUMENTS INCORRECT" echo "USAGE: bash copyScript.sh <list_of_filenames> <files_destination_address>" exit 1 fi # 获取脚本所在的绝对路径(无论在哪执行,都从这里开始搜索) SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) FILE_LIST="$1" DEST_DIR="$2" # 目标目录不存在则自动创建 if [ ! -d "$DEST_DIR" ]; then mkdir -p "$DEST_DIR" fi # 读取文件列表并处理每一行 while IFS= read -r filename || [ -n "$filename" ]; do # 跳过空行 [ -z "$filename" ] && continue # 从脚本所在目录搜索文件并复制 find "$SCRIPT_DIR" -iname "$filename" -print -exec cp {} "$DEST_DIR" \; done < "$FILE_LIST"
关键修改说明
- 固定搜索路径:用
SCRIPT_DIR获取脚本所在的绝对路径,让find从这个固定位置开始搜索,彻底摆脱执行目录的影响。 - 兼容特殊文件名:
IFS= read -r确保能正确读取带空格的文件名,|| [ -n "$filename" ]避免遗漏文件最后一行(如果该行没有换行符)。 - 容错处理:自动创建不存在的目标目录,跳过文件列表里的空行,减少执行报错。
额外实用提示
- 可以给
cp加-v参数(cp -v {} "$DEST_DIR"),复制时会打印日志,方便排查哪些文件被处理了。 - 如果你本来就想从执行脚本时的当前目录搜索,那执行前先切换到文件所在目录,或者给脚本加第三个参数用来指定搜索路径。
内容的提问来源于stack exchange,提问作者WKGuy
相关产品推荐
相关产品推荐

