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

时间:2018-06-29 00:55:46

标签: bash cmp

我有一个名为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 个答案:

答案 0 :(得分:1)

如注释中所述,代码的特定问题是您缺少$来扩展file。也就是说,只要文件名包含任何ls字符,处理findIFS的输出就会出现问题。空格是一个常见的示例,但是换行符会触发许多处理空格的尝试。

解决此问题的一种方法是将-execfind一起使用并调用外壳程序,因为您需要一些外壳程序功能来进行参数扩展。

在这里,我们将使用sh -c和要运行的字符串(即cmp命令),并传递sh 2个参数,第一个是占位符,它是外壳程序的名称,第二个是filename参数:

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

我们引用sh -c中的变量,并且find将确保{}作为单个参数正确传递。