-
概述
- 使用 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 字符串截取