代码之家  ›  专栏  ›  技术社区  ›  sscirrus

如何使用bash对多个具有相对路径的文件进行cmp

  •  0
  • sscirrus  · 技术社区  · 7 年前

    我有一个名为filesystem的目录,看起来有点像这样:

    - filesystem
      - etc
        - systemd
          - system
            - custom.service
            - custom2.service
      - hostname
    

    这些文件被复制到根目录,然后需要验证。例如: filesystem/etc/hostname 被复制到 /etc/hostname 是的。

    我试着编写一个bash脚本来比较文件系统中的每个文件。

    for file in $(find filesystem -type f)
    do
      cmp file ${file#filesystem}
    done
    

    目的 ${file#filesystem} 从第二个文件的路径中删除“文件系统”。

    这不起作用-它返回“没有这样的文件或目录”。如何修复此代码?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Eric Renouf    7 年前

    如注释中所述,代码的具体问题是缺少 $ 扩大 file 是的。也就是说,处理 ls find 当文件名包含任何 IFS 性格。空格是一个常见的例子,但是换行符会导致许多处理空格的尝试失败。

    解决这个问题的一种方法是 -exec 具有 找到 调用shell,因为您需要一些shell功能来进行参数扩展。

    在这里我们将使用 sh -c 要运行的字符串是 cmp 命令,我们会通过的 sh 2个参数第一个是shell名称的占位符,第二个是filename参数:

    find filesystem -type f -exec sh -c 'cmp "$1" "${1#filesystem}"' _ {} \;
    

    我们引用了 上海-中国 找到 将确保 {} 作为单个参数正确传入。

    推荐文章