含变量的目录路径批量处理失败:ls无法访问指定路径求助
解决方法
问题根源
你的filelist.txt里的路径包含未解析的Shell变量$ROOT_PATH,且被双引号包裹。xargs直接把内容传给ls时,Shell不会展开变量,而是把$ROOT_PATH当作路径的一部分,自然找不到对应目录。另外原命令的管道链逻辑也有缺陷:ls输出文件名后用grep过滤无法处理带空格的路径,且没满足递归查找的需求。
修正方案
方案1:先解析变量生成真实路径
先把文件里的变量展开成实际路径,再进行后续操作:
# 将filelist中的变量展开,生成真实路径列表 while IFS= read -r quoted_path; do # 移除路径两端的双引号,让Shell解析变量 real_path=$(eval echo "${quoted_path//\"/}") echo "$real_path" done < filelist.txt > resolved_paths.txt # 用find递归查找目标文件并执行替换 xargs -I {} find {} -type f -name "file_name_with_pattern" < resolved_paths.txt | xargs sed 's/XYZ/ABC/g'
方案2:直接循环处理(更简洁)
无需生成中间文件,直接读取并解析路径后完成操作:
while IFS= read -r quoted_path; do real_path=$(eval echo "${quoted_path//\"/}") find "$real_path" -type f -name "file_name_with_pattern" -exec sed 's/XYZ/ABC/g' {} + done < filelist.txt
关键说明
eval echo "${quoted_path//\"/}":先移除路径两端的双引号,再通过eval让Shell展开$ROOT_PATH变量,得到真实存在的目录路径。find的-exec ... {} +:替代xargs处理文件,避免路径含空格时出错,同时批量传递文件给sed提升执行效率。- 原命令用
ls做递归查找不可靠,find是处理递归文件查找的标准工具。
内容的提问来源于stack exchange,提问作者Sohrab
相关产品推荐
相关产品推荐

