我有一个名为文件系统的目录,它看起来有点像这样:
- 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}的目的是从第二个文件的路径中删除“文件系统”。
这是不工作的-它返回‘没有这样的文件或目录’。如何修正这段代码?
发布于 2018-06-29 11:45:26
正如注释中所指出的,代码的具体问题是缺少一个$来展开file。也就是说,每当文件名包含任何ls字符时,处理find或IFS的输出都会遇到问题。空格是一个常见的例子,但是换行符会绊倒许多处理空格的尝试。
解决这个问题的一个选择是将-exec与find一起使用并调用一个shell,因为您需要一些用于参数扩展的shell功能。
在这里,我们将使用带有字符串的sh -c来运行,这是cmp命令,我们将传递sh 2参数--第一个参数是占位符,它是shell的名称,第二个参数是文件名:
find filesystem -type f -exec sh -c 'cmp "$1" "${1#filesystem}"' _ {} \;我们引用sh -c和find中的变量,以确保{}作为单个参数正确传入。
https://stackoverflow.com/questions/51092926
复制相似问题