Linux - Shell - 替换文件名中的空格
-
概述
- 使用 shell 替换 文件名中的空格
-
背景
- 尝试用 find 配合 xargs, 在多个文件里找关键字
- 出现了问题
- 有空格的文件名, 并不是很好处理
-
准备
- os
- centos7
- os
1. 问题: 文件名中的空格
-
场景
- 需要在多个文本里, 查找某个关键字
-
方法
- find 配合 xargs
-
问题
- 文件名里有空格
-
结果
- xargs 会把 带有空格的文件名, 当做多个文件
-
处理
-
使用 -i {} 处理
-
结果
- 可以找出来了
- 但是会丢失 文件名
-
所以, 还是得换别的思路来处理
-
-
- 文件名里有空格
2. 处理思路
1. 思路1: 先打印文件名, 然后再查找
-
概述
- 打印文件名
- 查找
-
xargs 执行多条命令
-
概述
- xargs 后面, 可以一次执行多个命令
-
命令
> find . -type f | xargs -i sh -c 'echo {}; grep "#" {}'
-
结果
- 还是失败了
- 因为 grep 那里, 还是会把 含有空格 的文件名, 分开
- 所以还是 写脚本 吧
- 还是失败了
-
-
脚本
-
概述
- 将之前的思路, 写到一个脚本里
-
脚本
#!/bin/bash # 脚本名字, 叫 script01.sh # arg1 是 需要匹配的模式, 参数用 "" 包一下 # arg2 是 文件名 echo $2 grep "$1" "$2"
-
-
最终命令
-
命令
> find . -type f | xargs -i ./script01.sh "#" {}
-
结果
- 可以正常显示和打印
- 问题
- 就算没有模式, 文件名 也会被打印
- 一定程度上影响了判断
-
2. 思路2: 批量修改文件名
-
概述
- 批量修改文件名
- 然后直接 grep 查找
-
问题: 修改文件名
- 如何修改文件名
- 思路1: 删除空格
- 不行
- note1 2 修改后是 note12
- 可是如果真的有 note12 怎么办?
- 不行
- 思路2: 替换空格
- 使用特殊的字符替换
-
- _
- 其他合法字符
- 注意避免之前的重名问题即可
- 使用特殊的字符替换
- 思路1: 删除空格
- 如何修改文件名
-
脚本
#!/bin/bash # 脚本名 script02.sh # $1 是需要修改的文件名 # 涉及到 shell 的一些 字符串操作, 这个后续会讲 from=$1 echo $from # $from 如果是 find 找出来的, 会含有一个路径, 这个操作的目的, 是去掉 路径, 留下 文件名 from=${from##*/} echo $from to=${from// /_} echo $to mv "${from}" $to
-
最终命令
-
命令
> find . -type f -name "* *" | xargs -i ./script02.sh {} > find . -type f | xargs grep "#"
-
结果
- 还不错
-
ps
-
ref
- 学习 bash
-
其他
- 以后命名一定注意, 不会在 文件 和 目录 名称里, 带空格
-
后续
- shell 字符串截取
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出