如何使用bash处理具有相对路径的多个文件
我有一个名为filesystem的目录,看起来有点像这样:如何使用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
- 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好的-你能建议一个更好的答案吗?