当前位置: 首页 > article >正文

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。

小结

  • 请注意区分代码的差异。
  • 在进行移动操作的时候,建议先使用复制进行测试,测试没有问题后在进行移动操作
  • 若是文件命中出现空格会报错,无法复制文件。如下所示:
    在这里插入图片描述

http://www.kler.cn/a/384813.html

相关文章:

  • Ceisum无人机巡检视频投放
  • WPF+MVVM案例实战(二十二)- 制作一个侧边弹窗栏(CD类)
  • 防火墙|WAF|漏洞|网络安全
  • 使用Ida Pro和Core Dump文件定位崩溃位置
  • 验证二叉搜索树
  • 构建工具-webpack和vite笔记
  • 项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
  • 《C++类型转换:四种类型转换的规定》
  • java反序列化学习之CommonCollections3利用链的学习
  • (一)NodeJS环境安装、创建第一个Vue应用
  • C++入门基础知识140—【关于C++ 类构造函数 析构函数】
  • C++练习题(3)
  • ZABBIX API获取监控服务器OS层信息
  • 信息流投放账户、广告位置与优势
  • C++ vector
  • 代码随想录算法训练营第三十六天|Day36 动态规划
  • 蛋奶烙饼:美味与温暖的邂逅
  • Java图片转word
  • Elasticsearch-linux环境部署
  • 跨境电商独立站怎么建?如何收款?
  • CDGA|治理、技术、运营三管齐下构建高效数据管理体系
  • 【Linux】冯诺依曼体系、再谈操作系统
  • 内网部署web项目,外网访问不了?只有局域网能访问!怎样解决?
  • C语言心型代码解析
  • Qt开发技巧(二十二)设置QPA,打开记忆文件,清除表单页注意判断存在性,工程文件去重添加,按钮组的顺序设置,Qt的属性用来传值,查找问题的方法
  • 大数据工具 flume 的安装配置与使用 (详细版)