Linux - Shell - 替换文件名中的空格

  1. 概述
    1. 使用 shell 替换 文件名中的空格
  2. 背景
    1. 尝试用 find 配合 xargs, 在多个文件里找关键字
    2. 出现了问题
      1. 有空格的文件名, 并不是很好处理
  3. 准备
    1. os
      1. centos7

1. 问题: 文件名中的空格

  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. 注意避免之前的重名问题即可
  3. 脚本

    #!/bin/bash
    # 脚本名 script02.sh
    # $1 是需要修改的文件名
    # 涉及到 shell 的一些 字符串操作, 这个后续会讲
    
    from=$1
    echo $from
    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. 以后命名一定注意, 不会在 文件 和 目录 名称里, 带空格

猜你喜欢

转载自www.cnblogs.com/xy14/p/12217877.html