如何使用 bash 压缩多个具有相对路径的文件
How to cmp multiple files with relative paths using bash
我有一个名为文件系统的目录,看起来有点像这样:
- 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}
的目的是从第二个文件的路径中删除 'filesystem'。
这不起作用 - 它 returns 'No such file or directory'。如何修复此代码?
如评论中所述,您的代码的具体问题是您缺少 $
来扩展 file
。也就是说,只要文件名包含任何 IFS
字符,处理 ls
或 find
的输出就会 运行 出现问题。空格是一个常见的例子,但换行符会阻碍许多处理空格的尝试。
解决此问题的一个选项是将 -exec
与 find
一起使用并调用 shell,因为您需要一些 shell 功能来扩展参数。
这里我们将使用 sh -c
和 运行 的字符串,这是 cmp
命令,我们将传递 sh
2 个参数,第一个是占位符是 shell 的名称,第二个是文件名参数:
find filesystem -type f -exec sh -c 'cmp "" "${1#filesystem}"' _ {} \;
我们引用 sh -c
中的变量,find
将确保 {}
作为单个参数正确传递。
我有一个名为文件系统的目录,看起来有点像这样:
- 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}
的目的是从第二个文件的路径中删除 'filesystem'。
这不起作用 - 它 returns 'No such file or directory'。如何修复此代码?
如评论中所述,您的代码的具体问题是您缺少 $
来扩展 file
。也就是说,只要文件名包含任何 IFS
字符,处理 ls
或 find
的输出就会 运行 出现问题。空格是一个常见的例子,但换行符会阻碍许多处理空格的尝试。
解决此问题的一个选项是将 -exec
与 find
一起使用并调用 shell,因为您需要一些 shell 功能来扩展参数。
这里我们将使用 sh -c
和 运行 的字符串,这是 cmp
命令,我们将传递 sh
2 个参数,第一个是占位符是 shell 的名称,第二个是文件名参数:
find filesystem -type f -exec sh -c 'cmp "" "${1#filesystem}"' _ {} \;
我们引用 sh -c
中的变量,find
将确保 {}
作为单个参数正确传递。