linux命令使用案例_将查找结果复制/移动到对应文件夹下
项目场景:
根据查找结果对文件进行复制/移动
我想在/home/project/
文件夹下查找20230830.html结尾的文件 并将这些文件移动到/bak
文件下,且查找到的20230830.html结尾的文件放到对应的文件夹下。
环境说明
- CentOS7(麒麟KylinV10)
解决方法
直接上代码
# 移动
find /home/project/html_runtime/Htmlpc -name "*20230830.html" -exec mkdir -p bak/$(dirname {}) \; -exec mv {} bak/$(dirname {})/ \;
#复制
find /home/project/html_runtime/Htmlpc -name "*20230830.html" -exec mkdir -p bak/{} \; -exec cp {} bak/{} \;
#复制文件,并根据文件所在文件夹自动创建文件夹,并将文件复制到对应的文件夹下
find /home/project/html_runtime/Htmlpc -name "*20230830.html" -exec sh -c 'dir=$(dirname {}); base=$(basename {}); newdir=${dir//20230830.html/}; mkdir -p "/home/project/bak/$newdir"; cp {} "/home/project/bak/$newdir/${base%20230830.html}"' \;
#复制文件,并根据文件所在文件夹自动创建文件夹,并将文件复制到对应的文件夹下 注意与上述代码区分不同。
find /home/project/html_runtime/Htmlpc -name "*20230830.html" -exec sh -c 'dir=$(dirname {}); base=$(basename {}); newdir=${dir//20230830.html/}; mkdir -p "/home/project/bak/$newdir"; cp {} "/home/project/bak/$newdir/${base}"' \;
命令 | 解释 |
---|---|
find /home/project/html_runtime/Htmlpc -name "*20230830.html" | 在指定目录下查找以20230830.html结尾的文件。 |
-exec mkdir -p bak/$(dirname {}) \; | 对于每个找到的文件,创建对应的目标目录结构在bak文件夹下。$(dirname {}) 获取找到文件的目录部分,确保目标路径存在。 |
-exec mv {} bak/$(dirname {})/ \; | 将找到的文件移动到对应的bak 文件夹下的目录中。 |
-exec cp {} bak/{} \; | 将找到的文件复制到对应的 bak 文件夹下的目录中。 |
-exec sh -c | 对于每个找到的文件,执行一个 shell 命令(-exec sh -c...) |
dir=$(dirname {}) 和 base=$(basename {}) | 在 shell 命令中,获取文件的目录部分(dir=\$(dirname {})) 和文件名部分(base=\$(basename {})) 。 |
newdir=${dir//20230830.html/} | 使用字符串替换操作${dir//20230830.html/} 去除目录中的 20230830.html 部分得到新的目录名称newdir 。这是是一种参数扩展的用法,具体含义如下:${dir} 表示取变量 dir 的值。假设 dir 的值是一个包含 20230830.html 的字符串路径,比如 path/to/some/20230830.html/subdir 。//20230830.html/ 是一个模式替换操作。其中// 表示全局替换,即把所有匹配的部分都替换掉。这里的意思是把变量 dir 中的所有 20230830.html 字符串替换为空字符串。所以最终 newdir 的值就是将原始 dir 中的 20230830.html 全部去除后的结果,比如 /path/to/some/subdir 。 |
${base%20230830.html} | ${base} 是 find 命令找到的文件名部分(通过 basename {} 获取)。假设文件名是 file20230830.html 。${base%20230830.html } 是一种参数扩展操作,它会从变量 base 的值后面删除最短匹配的 20230830.html 字符串。所以这里最终得到的就是去除了 20230830.html 后的文件名,比如 file。 |
小结
- 请注意区分代码的差异。
- 在进行移动操作的时候,建议先使用复制进行测试,测试没有问题后在进行移动操作。
- 若是文件命中出现空格会报错,无法复制文件。如下所示: