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

如何使用bash处理具有相对路径的多个文件,bash,cmp,Bash,Cmp,我有一个名为filesystem的目录,看起来有点像这样: - filesystem - etc - systemd - system - custom.service - custom2.service - hostname 这些文件被复制到根目录中,然后需要进行验证。例如:文件系统/etc/hostname被复制到/etc/hostname 我试着编写一个bash脚本来比较文件系统中的每个文件 for file in $(find

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

- filesystem
  - etc
    - systemd
      - system
        - custom.service
        - custom2.service
  - hostname
这些文件被复制到根目录中,然后需要进行验证。例如:
文件系统/etc/hostname
被复制到
/etc/hostname

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

for file in $(find filesystem -type f)
do
  cmp file ${file#filesystem}
done
${file#filesystem}
的目的是从第二个文件的路径中删除“filesystem”


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

如注释中所述,您的代码的具体问题是缺少展开
文件的
$
。也就是说,只要文件名包含任何
IFS
字符,处理
ls
find
的输出就会遇到问题。空格是一个常见的例子,但是换行符会使许多处理空格的尝试失败

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

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

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

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

您是否需要
cmp$file${file#filesystem}
,尽管如果在任何文件名中有空格或其他类似字符,整个过程都会中断,在
find
的输出上循环是一种反模式,会导致困难您缺少
$
之前的
$文件。这是真实代码还是复制错误?要调试,请将
cmd
更改为
echo
?祝你好运。@Barmar这就是问题所在。谢谢。@EricRenouf好的-你能建议一个更好的答案吗?