如何用find命令将文件路径与内容分别存入两个变量?
可行,给你两种实用方案
你的原命令有两个小问题:一是变量赋值不能有空格(var = ...应该改成var=$(...)),二是*.ext应该用-name "*.ext"传给find,否则会被shell提前扩展,可能不符合预期。
要分别获取文件路径和内容到独立变量,不需要让find一次输出两者,换个思路就行:先收集所有目标文件的路径,再逐个读取内容,用数组来对应路径和内容的关系是最稳妥的方式,尤其是处理带空格/特殊字符的文件名时。
方案1:基础版(适合文件名无特殊字符)
# 获取所有匹配的文件路径,存入paths数组 paths=($(find /some/path -name "*.ext" -type f)) # 初始化contents数组存储对应文件内容 contents=() # 遍历每个文件,读取内容 for file in "${paths[@]}"; do contents+=("$(cat "$file")") done
之后你可以通过${paths[0]}获取第一个文件的路径,${contents[0]}获取对应内容,以此类推。
方案2:安全版(支持含空格/特殊字符的文件名)
如果你的文件名可能包含空格、换行或其他特殊字符,用下面的方法避免分词错误:
# 初始化两个空数组 paths=() contents=() # 用find的-print0输出以null分隔的路径,再通过read -d ''安全读取 while IFS= read -r -d '' file; do paths+=("$file") # 读取文件内容存入contents数组 contents+=("$(cat "$file")") done < <(find /some/path -name "*.ext" -type f -print0)
原理说明
find本身确实没法直接同时输出路径和内容并分存,但我们可以分两步走:
- 先用find筛选出所有符合条件的文件路径,存储到一个变量(数组)里;
- 遍历这个路径数组,逐个读取文件内容,存入另一个对应的数组。
这样就能实现路径和内容的一一对应,分别存在独立的变量中。
内容的提问来源于stack exchange,提问作者Joseira Malledo
相关产品推荐
相关产品推荐

