我有一个名为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}
的目的是从第二个文件的路径中删除“文件系统”。
这不起作用-返回“无此文件或目录”。如何修复此代码?
答案 0 :(得分:1)
如注释中所述,代码的特定问题是您缺少$
来扩展file
。也就是说,只要文件名包含任何ls
字符,处理find
或IFS
的输出就会出现问题。空格是一个常见的示例,但是换行符会触发许多处理空格的尝试。
解决此问题的一种方法是将-exec
与find
一起使用并调用外壳程序,因为您需要一些外壳程序功能来进行参数扩展。
在这里,我们将使用sh -c
和要运行的字符串(即cmp
命令),并传递sh
2个参数,第一个是占位符,它是外壳程序的名称,第二个是filename参数:
find filesystem -type f -exec sh -c 'cmp "$1" "${1#filesystem}"' _ {} \;
我们引用sh -c
中的变量,并且find
将确保{}
作为单个参数正确传递。