我有一个名为filesystem的目录,看起来有点像这样:
- filesystem - etc - systemd - system - custom.service - custom2.service - hostname
这些文件被复制到根目录,然后需要验证。例如: filesystem/etc/hostname 被复制到 /etc/hostname 是的。
filesystem/etc/hostname
/etc/hostname
我试着编写一个bash脚本来比较文件系统中的每个文件。
for file in $(find filesystem -type f) do cmp file ${file#filesystem} done
目的 ${file#filesystem} 从第二个文件的路径中删除“文件系统”。
${file#filesystem}
这不起作用-它返回“没有这样的文件或目录”。如何修复此代码?
如注释中所述,代码的具体问题是缺少 $ 扩大 file 是的。也就是说,处理 ls 或 find 当文件名包含任何 IFS 性格。空格是一个常见的例子,但是换行符会导致许多处理空格的尝试失败。
$
file
ls
find
IFS
解决这个问题的一种方法是 -exec 具有 找到 调用shell,因为您需要一些shell功能来进行参数扩展。
-exec
找到
在这里我们将使用 sh -c 要运行的字符串是 cmp 命令,我们会通过的 sh 2个参数第一个是shell名称的占位符,第二个是filename参数:
sh -c
cmp
sh
find filesystem -type f -exec sh -c 'cmp "$1" "${1#filesystem}"' _ {} \;
我们引用了 上海-中国 和 找到 将确保 {} 作为单个参数正确传入。
上海-中国
{}