如何使用 bash 压缩多个具有相对路径的文件

How to cmp multiple files with relative paths using bash

我有一个名为文件系统的目录,看起来有点像这样:

- 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} 的目的是从第二个文件的路径中删除 'filesystem'。

这不起作用 - 它 returns 'No such file or directory'。如何修复此代码?

如评论中所述,您的代码的具体问题是您缺少 $ 来扩展 file。也就是说,只要文件名包含任何 IFS 字符,处理 lsfind 的输出就会 运行 出现问题。空格是一个常见的例子,但换行符会阻碍许多处理空格的尝试。

解决此问题的一个选项是将 -execfind 一起使用并调用 shell,因为您需要一些 shell 功能来扩展参数。

这里我们将使用 sh -c 和 运行 的字符串,这是 cmp 命令,我们将传递 sh 2 个参数,第一个是占位符是 shell 的名称,第二个是文件名参数:

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

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