一、背景
目前大数据组件已通过jenkins流水线pipeline的方式实现打rpm包,这个过程分两个步骤:
1. 根据组件镜像打tar包
2. 根据tar包和spec文件打rpm包
二、问题发现及解决
1. 问题:给某组件通过执行流水线出rpm包,在进行rpm包验证时,发现rpm包中的文件相比较tar包缺少了一个隐藏文件
2. 排查:打rpm包的流水线jenkinsfile中,mv命令操作问题导致目标文件夹比源文件夹缺少隐藏文件
3. 原因:在打rpm包的逻辑中,由于某些tar包未接入流水线实现标准化打包,而是由研发同学手动打包提供,而研发提供的tar包可能命名不规范,所以在打rpm包时需要进行文件夹重命名操作,使用的命令为 mv filename/* filename2/ ,经查这种方式会导致filename里的隐藏文件不会被移动到filename2里
4. 解决:
将mv filename/* filename2/(filename2存在情况下)
改为mv filename filename2(filename2不存在情况下)
三、测试验证
1. 创建隐藏文件
在文件名前加“.”,例如touch .yincang.txt
2. 查看隐藏文件
在Linux系统中,以点(.)开头的文件被视为隐藏文件。要列出这些隐藏文件,可以使用ls命令并带上-a或者-A选项。
-a选项会列出所有文件,包括隐藏文件和.以及..目录。
而-A选项则会列出除了.和..以外的所有文件,包括隐藏文件。
3. mv几个不同命令及效果
(1)mv filename/* filename2/
含义:将filename文件夹下的文件移动(剪切)到filename2
a) 注意不会移动隐藏文件到目标文件夹!!!
b) filename2需要提前新建好,否则会报错no such file or directory
c) mv之后filename和filename2同时存在
d) 隐藏文件被遗留在源文件夹filename下
(2)mv filename filename2
含义:相当于对整个文件夹进行移动,我们想要实现filename文件夹直接重命名为filename2,需要注意mv操作前filename2应不存在!!!否则会和预期不符
a) 因为操作针对整个文件夹,所以filename2下会包含filename下的全部文件,包含隐藏文件
b) 若filename2不存在,则是将filename文件夹重命名为filename2;
c) 若filename2已经存在,则是将filename文件夹移动到filename2文件夹下
(3)mv filename/.[^.]* filename2/
含义:将filename文件夹下的隐藏文件移动(剪切)到filename2文件夹下
a) 只针对隐藏文件进行操作
b) 源目录的隐藏文件被剪切走
(4)mv filename/* .[^.]* filename2/
含义:将filename文件夹下的所有文件(非隐藏文件+隐藏文件)移动(剪切)到filename2文件夹下
a) 非隐藏文件+隐藏文件都被筛选到,并移动到目标文件夹
b) 隐藏文件被成功移动至目标文件夹,但查看源文件夹下也还会有隐藏文件存在
4. 综上所述
如果想要进行文件夹重命名,建议用命令2:mv filename filename2,因为这种方法针对整个文件夹进行操作,不会遗漏隐藏文件,而且源文件夹不做保留,仅保留目标文件夹。但要注意mv操作前不要新建目标文件夹,否则结果会多一层目录(xxx/filename2/filename),与预期不符
参考文档: