shell之批量操作(二)

2,182 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

经过批量操作(一)这篇文章中,我们已经尝试批量创建功能,就一个感觉得劲的很.下面我们继续来学习一下其他行为的批量操作.

您能在这里开到啥

  1. 批量移动
  2. 批量修改
  3. 批量复制
  4. 批量删除

开始前的准备

批量创建的文章中,我们已经完成了批量创建的脚本.这里就直接使用之前的劳动成功就行.下面我们就可以下目录结构.

    .
    ├── batch_ts (测试项目)
    │   ├── a
    │   │   └── a_text.txt
    │   ├── b
    │   │   └── b_text.txt
    │   ├── c
    │   │   └── c_text.txt
    │   └── d
    │       └── d_text.txt
    ├── p_create.sh (批量创建sh)
    └── p_tool.sh(工具sh)

下面开始我们批量操作吧.

批量移动

简单分析一下.既然我们要进行移动操作,命令必须是mv.之前学习中.并没有涉及到mv指令.这里我们就浅浅的学习一下,然后应用到我们的批量移动业务中.

  1. mv指令

    • 命令格式
      • mv [参数] 源文件或目录 目标文件或目录
    • 参数
      • 参数含义
        -b覆盖前,先执行备份
        -f直接覆盖.不管文件存在不存在
        -i若目标文件已存在,会咨询是否覆盖
        -u如目标文件已存在,只有移动文件比目标文件新,才会执行更新操作
    • 事例
      • 修改文件名字
        • 如果移动到的目标文件是文件.则执行文件名字修改操作.
        • eg:mv ts.txt tst.txt
        • 结果: tst.txt 修改成ts.txt名字
      • 移动单个文件
        • eg:mv ts.txt a
        • 结果: ts.txt文件移动到a目录下
      • 移动多个文件
        • eg: mv ts.txt ts1.txt a

          移动ts.txtts1.txt文件到a目录

        • eg: mv *.txt a

          移动文件后缀是.txt文件到a目录

  2. 实现批量移动

    • 批量把后缀.txt文件,移动到a目录下

      通过在批量操作(一)的实践中,可以快速的列出执行步骤.如下所示

      1. 寻找符合条件的所有文件或目录

      2. 循环执行移动操作.

      基于之前的经验.这里我就不再分步讲解了.直接上代码.

      # 批量移动txt文件
      mvtxt() {
          target="*.txt"
          find "$project_path" -name "$target" -print0 | while IFS= read -r -d '' file; do
              echomsg "$file"
              mv "$file" "$project_demo_path/a"
          done
      }
      mvtxt
      

      执行结果如下所示:

      截屏2022-12-02 19.33.11.png

    • 批量将文件夹下指定文件移动到上级目录

      # 批量移动到上级目录
      mvsuptxt() {
            find "$project_path" -name "$target" -print0 | while IFS= read -r -d '' file; do
                echomsg "$file"
                # 获取目标文件的上级目录
                supDir=$(
                dirname "$(dirname "$file")" || exit
                )
                echomsg "$supDir"
                # 进行移动操作
                mv "$file" "$supDir"
                echomsg "移动$file$supDir/$file完成"
            done
      }
      

      执行结果如下所示:

      截屏2022-12-02 19.49.43.png

批量修改

shell之批量修改内容这篇文章中,我们已经知道了怎么对文件内容进行修改,这里我们就记录一下怎么对文件名字进行修改.不过还是要把文件内容修改,进行重温一下.这里就直接上代码了

  • 批量修改文件内容

    • 使用find批量修改文件内容
      find "$project_path" -name "*.txt" -print0 | while IFS= read -r -d '' file; do
                  if grep "shell" "$file"; then
                      sed -i "" "s/shell/tt/g" "$file"
                  fi
      done
      ``
      
    • 使用grep批量修改文件内容
      grep -rn "tt" . | while IFS= read -r file; do
         sed -i "" "s/tt/shell" "$file"
      done
      
  • 批量修改文件名称

    经过上面对mv指令的学习,我们知道它有修改文件名字的功效.这里我们就直接使用mv进行修改吧.

    # 第一步执行mv操作,让项目恢复到初始状态
    mvtxt
    # 第二步,执行修改操作
    changeName() {
         find "$project_path" -name "$target" -print0 | while IFS= read -r -d '' file; do
             echomsg "$file"
             dirpath=$(
                 dirname "$file" || exit
             )
             mv "$file" "$dirpath/text.txt"
         done
    }
    
    

    执行结果如下

    截屏2022-12-02 20.03.28.png

批量复制

经过前面的测试和学习,到这里那不就是手到擒来.轻松的很.这里我们只需要使用cp指令即可. 还是老样子,比如我们现在需要把所有的.txt文件.复制到文件夹e中,那我们就是先找,再创建文件,然后执行复制操作即可.看代码

cptxt() {
      # 第一步找到文件
      find "$project_path" -name "$target" -print0 | while IFS= read -r -d '' file; do
          echomsg "$file"
          # 创建e文件夹
          cd "$project_demo_path" || exit
          if [ ! -f "e" ]; then
              mkdir -p "e"
          fi
          # 执行复制操作
          cp "$file" "$project_demo_path/e"
      done
}

执行结果如下

截屏2022-12-02 20.13.12.png

批量删除

这个也是很简单,直接上代码

delecttxt() {
    find "$project_path" -name "$target" -print0 | while IFS= read -r -d '' file; do
        echomsg "$file"
        rm "$file"
    done
}

执行结果如下

截屏2022-12-02 20.16.13.png

比如批量删除文件夹,方式都是一样的.只是替换一下查找条件即可

总结: 之前只是分享了思路,这里我也把自己再学习的时候,编写的demo也分享给大家.方便大家更好的理解.当然也算是自己学习的一个记录.

DEMO

系列文章

参考文章