首页 > 技术文章 > Linux - Shell - 替换文件名中的空格

xy14 2020-01-20 14:33 原文

  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. 其他合法字符
          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 字符串截取

推荐阅读