1. 概述

    1. 使用 shell 替换 文件名中的空格
  2. 背景

    1. 尝试用 find 配合 xargs, 在多个文件里找关键字
    2. 出现了问题
      1. 有空格的文件名, 并不是很好处理
  3. 准备

    1. os
      1. centos7
  1. 场景

    1. 需要在多个文本里, 查找某个关键字
  2. 方法

    1. find 配合 xargs
  3. 问题

    1. 文件名里有空格
      1. 结果

        1. xargs 会把 带有空格的文件名, 当做多个文件
      2. 处理

        1. 使用 -i {} 处理

        2. 结果

          1. 可以找出来了
          2. 但是会丢失 文件名
        3. 所以, 还是得换别的思路来处理

2. 处理思路

1. 思路1: 先打印文件名, 然后再查找

  1. 概述

    1. 打印文件名
    2. 查找
  2. xargs 执行多条命令

    1. 概述

      1. xargs 后面, 可以一次执行多个命令
    2. 命令

      > find . -type f | xargs -i  sh -c 'echo {}; grep "#" {}'
      
    3. 结果

      1. 还是失败了
        1. 因为 grep 那里, 还是会把 含有空格 的文件名, 分开
        2. 所以还是 写脚本 吧
  3. 脚本

    1. 概述

      1. 将之前的思路, 写到一个脚本里
    2. 脚本

      #!/bin/bash
      # 脚本名字, 叫 script01.sh
      # arg1 是 需要匹配的模式, 参数用 "" 包一下
      # arg2 是 文件名
      echo $2
      grep "$1" "$2"
      
  4. 最终命令

    1. 命令

      > find . -type f | xargs -i ./script01.sh "#" {}
      
    2. 结果

      1. 可以正常显示和打印
      2. 问题
        1. 就算没有模式, 文件名 也会被打印
        2. 一定程度上影响了判断

2. 思路2: 批量修改文件名

  1. 概述

    1. 批量修改文件名
    2. 然后直接 grep 查找
  2. 问题: 修改文件名

    1. 如何修改文件名
      1. 思路1: 删除空格
        1. 不行
          1. note1 2 修改后是 note12
          2. 可是如果真的有 note12 怎么办?
      2. 思路2: 替换空格
        1. 使用特殊的字符替换
          1. -
          2. _
          3. 其他合法字符
          4. 注意避免之前的重名问题即可
  3. 脚本

    #!/bin/bash
    # 脚本名 script02.sh
    # $1 是需要修改的文件名
    # 涉及到 shell 的一些 字符串操作, 这个后续会讲
    
    from=$1
    echo $from
    # $from 如果是 find 找出来的, 会含有一个路径, 这个操作的目的, 是去掉 路径, 留下 文件名
    from=${from##*/}
    echo $from
    to=${from// /_}
    echo $to
    
    mv "${from}" $to
    
  4. 最终命令

    1. 命令

      > find . -type f -name "* *" | xargs -i ./script02.sh {}
      > find . -type f | xargs grep "#" 
      
    2. 结果

      1. 还不错

ps

  1. ref

    1. 学习 bash
  2. 其他

    1. 以后命名一定注意, 不会在 文件 和 目录 名称里, 带空格
  3. 后续

    1. shell 字符串截取

相关文章: