linux shell編程系列之-—02 命令行下文件名中包含特殊符號如何的處理方法


問題描述

前面《Jenkins系列之-—07 實現SQL腳本批量執行》在實際運行過程中碰到如下問題
某次一模塊SQL腳本執行完成后,再次執行還會運行,即備份執行完成的腳本這個功能沒起作用,初步斷定是腳本名中有某種特殊符號導致的

分析:

linux中碰到文件名中有空格的處理方法

① 使用引號將文件名括起來: touch "Me like yuh.mp3"
② 空格前使用連接符號""轉義: touch Me\ like\ yuh.mp3 “\”
③ 下面腳本可將文件名中間的空格用下划線_替換(注意:並不能替換文件名后面的空格)如下所示

find . -type f -name "* *" -print |
while read name; do
na=$(echo $name | tr ' ' '_')
if [[ $name != $na ]]; then
mv "$name" "$na"
fi
done

文件名后面的空格
for file in *; do mv "$file" echo "$file" | tr ' ' '\n' ; done
for file in ' '; do mv "$file" echo "$file" | sed -e 's/ /n/g'; done

解決辦法

  1. sql文件執行完成在備份時,如果文件名中間有空格,將中間空格替換為_
  2. 在比較文件名是否一致時,兼容有空格的文件名

擴展--碰到文件名中有其他特殊字符如何處理

1. 最直接的辦法,使用時候用絕對路徑,如:touch ./tmp/Me like yuh.mp3

2. 不同類型特殊符號處理:

2.1 不需要處理的

具有加號(+),    
有百分比(%)       
有^
有大括號{}
有方括號[]
有得分(_)下
有等於(=)
有問號(?)
有逗號(,)
有冒號(:)

2.2 需要處理的

文件類型 處理方式
具有破折號(-)的文件 $ touch -- -abc.txt
具有HASH(#)的文件 $ touch '#abc.txt'
具有分號(;)的文件 $ touch ';abc.txt'
具有美元符號($)的文件 $ touch '$12.txt'
具有感嘆號(!)的文件 $ touch '!12.txt'
具有符號(@)的文件 $ touch '@12.txt'
具有&符(&) 的文件 $ touch '&12.txt'
具有括號()的文件 $ touch '(12.txt)'
具有反斜線(\)$的文件 $ touch '\12.txt'
具有Chevrons <>的文件名 $ touch ''

2.3 其他類型
具有星號(*)的文件
不需要處理的,刪除選時間需要注意

前傾斜的特殊情況
你不能創建一個文件名,其中包括正斜杠(/)直到你的文件系統錯誤。 沒有辦法逃脫前斜線。
所以,如果你可以創建一個文件,如“/12.txt’或’B / c.txt’,那么你的文件系統有錯誤或你有Unicode支持,它可以讓你創建一個斜杠的文件。 在這種情況下,正斜杠不是真正的正斜杠,而是一個看起來像正斜杠的Unicode字符。

文件名中的點標記(。)
在文件名中包含引號(單引號和雙引號) 要在文件名中加引號,我們必須使用交換規則。 也就是說,如果您需要在文件名中包含單引號,請用雙引號將文件名括起來,如果您需要在文件名中有雙引號,請用單引號括起來

文件名中的波浪號(〜)
在Linux中一些編輯器Emacs等創建該文件的備份文件進行編輯。 備份文件具有原始文件的名稱以及文件名末尾的波浪號。 您可以有一個文件,其名稱包括波浪號,在任何位置簡單為:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM