Linux 下如何处理包含空格和特殊字符的文件名
注意:我們可能有各種類型的文件,但是為了簡(jiǎn)單以及方便實(shí)現(xiàn),在本文中我們只用文本文件(.txt)做演示。
最常見(jiàn)的文件名例子:
abc.txtavi.txtdebian.txt...數(shù)字文件名例子:
121.txt3221.txt674659.txt...字母數(shù)字文件名例子:
eg84235.txt3kf43nl2.txt2323ddw.txt...包含特殊字符的文件名的例子,并不常見(jiàn):
#232.txt#bkf.txt#bjsd3469.txt#121nkfd.txt-2232.txt-fbjdew.txt-gi32kj.txt--321.txt--bk34.txt...一個(gè)顯而易見(jiàn)的問(wèn)題是 - 在這個(gè)星球上有誰(shuí)會(huì)創(chuàng)建和處理包含井號(hào)(#),分號(hào)(;),破折號(hào)(-)或其他特殊字符的文件/文件夾啊。
我和你想的一樣,這種文件名確實(shí)不常見(jiàn),不過(guò)在你必須得處理這種文件名的時(shí)候你的 shell 也不應(yīng)該出錯(cuò)或罷工。而且技術(shù)上來(lái)說(shuō),Linux 下的一切比如文件夾、驅(qū)動(dòng)器或其他所有的都被當(dāng)作文件處理。
處理名字包含破折號(hào)(-)的文件
創(chuàng)建以破折號(hào)(-)開頭的文件,比如 -abx.txt。
$?touch?-abc.txt測(cè)試輸出
touch:?invalid?option?--?'b'Try?'touch?--help'?for?more?information.出現(xiàn)上面錯(cuò)誤的原因是,shell 把破折號(hào)(-)之后的內(nèi)容認(rèn)作參數(shù)了,而很明顯沒(méi)有這樣的參數(shù),所以報(bào)錯(cuò)。
要解決這個(gè)問(wèn)題,我們得告訴 Bash shell(是的,這里以及本文后面的大多數(shù)例子都是基于 BASH 環(huán)境)不要將特殊字符(這里是破折號(hào))后的字符解釋為參數(shù)。
有兩種方法解決這個(gè)錯(cuò)誤:
$?touch?--?-abc.txt?[方法?#1]$?touch?./-abc.txt?[方法?#2]你可以通過(guò)運(yùn)行命令 ls 或 ls -l 列出詳細(xì)信息來(lái)檢查通過(guò)上面兩種方式創(chuàng)建的文件。
$?ls?-ltotal?0-rw-r--r--?1?avi?avi?0?Jun?8?11:05?-abc.txt要編輯上述文件可以這樣:
$?nano?--?-abc.txt?或者?$?nano?./-abc.txt注意:你可以將 nano 替換為任何其他你喜歡的編輯器比如說(shuō) vim:
$?vim?--?-abc.txt?或者?$?vim?./-abc.txt如果只是簡(jiǎn)單地移動(dòng)文件可以這樣:
$?mv?--?-abc.txt?-a.txt或者$?mv?--?-a.txt?-abc.txt刪除這種文件,可以這樣:
$?rm?--?-abc.txt或者$?rm?./-abc.txt如果一個(gè)目錄下有大量這種名字包含破折號(hào)的文件,要一次全部刪除的話,可以這樣:
$?rm?./-*重要:
上面討論的規(guī)則可以同樣應(yīng)用于名字中包含任意數(shù)量以及任意位置的連接符號(hào)的文件。就是說(shuō),-a-b-c.txt,ab-c.txt,abc-.txt,等等。
上面討論的規(guī)則可以同樣應(yīng)用于名字中包含任意數(shù)量以及任意位置連接符號(hào)的文件夾,除了一種情況,在刪除一個(gè)文件夾的時(shí)候你得這樣使用rm -rf:
$ rm -rf -- -abc 或者 $ rm -rf ./-abc
處理名字包含井號(hào)(#)的文件
符號(hào)#在 BASH 里有非常特別的含義。#之后的一切都會(huì)被認(rèn)為是評(píng)論,因此會(huì)被 BASH 忽略。
通過(guò)例子來(lái)加深理解:
創(chuàng)建一個(gè)名字是 #abc.txt 的文件:
$?touch?#abc.txt測(cè)試輸出
touch:?missing?file?operandTry?'touch?--help'?for?more?information.出現(xiàn)上面錯(cuò)誤的原因是,BASH 將 #abc.txt 解釋為評(píng)論而忽略了。所以命令 touch沒(méi)有收到任何文件作為參數(shù),所以導(dǎo)致這個(gè)錯(cuò)誤。
要解決這個(gè)問(wèn)題,你可能需要告訴 BASH 不要將 # 解釋為評(píng)論。
$?touch?./#abc.txt或者$?touch?'#abc.txt'檢查剛創(chuàng)建的文件:
$?ls?-ltotal?0-rw-r--r--?1?avi?avi?0?Jun?8?12:14?#abc.txt現(xiàn)在創(chuàng)建名字中除了開頭的其他地方包含 # 的文件。
$?touch?./a#bc.txt$?touch?./abc#.txt?或者$?touch?'a#bc.txt'$?touch?'abc#.txt'運(yùn)行 ‘ls -l‘ 來(lái)檢查:
$?ls?-ltotal?0-rw-r--r--?1?avi?avi?0?Jun?8?12:16?a#bc.txt-rw-r--r--?1?avi?avi?0?Jun?8?12:16?abc#.txt如果同時(shí)創(chuàng)建兩個(gè)文件(比如 a 和 #bc)會(huì)怎么樣:
$?touch?a.txt?#bc.txt檢查剛創(chuàng)建的文件:
$?ls?-ltotal?0-rw-r--r--?1?avi?avi?0?Jun?8?12:18?a.txt很明顯上面的例子中只創(chuàng)建了文件 a 而文件 #bc 被忽略了。對(duì)于上面的情況我們可以這樣做,
$?touch?a.txt?./#bc.txt或者$?touch?a.txt?'#bc.txt'檢查一下:
$?ls?-ltotal?0-rw-r--r--?1?avi?avi?0?Jun?8?12:20?a.txt-rw-r--r--?1?avi?avi?0?Jun?8?12:20?#bc.txt可以這樣移動(dòng)文件:
$?mv?./#bc.txt?./#cd.txt或者$?mv?'#bc.txt'?'#cd.txt'這樣拷貝:
$?cp?./#cd.txt?./#de.txt或者$?cp?'#cd.txt'?'#de.txt'可以使用你喜歡的編輯器來(lái)編輯文件:
$?vi?./#cd.txt或者$?vi?'#cd.txt'$?nano?./#cd.txt或者$?nano?'#cd.txt'這樣刪除:
$?rm?./#bc.txt?或者$?rm?'#bc.txt'要?jiǎng)h除所有以井號(hào)(#)開頭的文件,可以這樣:
#?rm?./#*處理名字包含分號(hào)(;)的文件
如果你還不知道的話,分號(hào)在 BASH 里起到命令分隔的作用,其他 shell 可能也是一樣的。分號(hào)作為分隔符可以讓你一次執(zhí)行幾個(gè)命令。你碰到過(guò)名字包含分號(hào)的文件嗎?如果沒(méi)有的話,這里有例子。
創(chuàng)建一個(gè)名字包含分號(hào)的文件。
$?touch?;abc.txt測(cè)試輸出
touch:?missing?file?operandTry?'touch?--help'?for?more?information.bash:?abc.txt:?command?not?found出現(xiàn)上面錯(cuò)誤的原因是,在運(yùn)行上面命令的時(shí)候 BASH 會(huì)把 touch 解釋為一個(gè)命令但是在分號(hào)前沒(méi)有任何文件參數(shù),所以報(bào)告錯(cuò)誤。然后報(bào)告的另一個(gè)錯(cuò)誤找不到命令 abc.txt,只是因?yàn)樵诜痔?hào)后 BASH 會(huì)期望另一個(gè)新的命令,而 abc.txt 并不是一個(gè)命令。
要解決這個(gè)問(wèn)題,我們得告訴 BASH 不要將分號(hào)解釋為命令分隔符,例如:
$?touch?./';abc.txt'或者$?touch?';abc.txt'注意:我們將文件名用單引號(hào) '' 包含起來(lái)。這樣可以告訴 BASH 分號(hào) ; 是文件名的一部分而不是命令分隔符。
對(duì)名字包含分號(hào)的文件和文件夾的其他操作(就是,拷貝、移動(dòng)、刪除)可以直接將名字用單引號(hào)包含起來(lái)就好了。
處理名字包含其他特殊字符的文件/文件夾
文件名包含加號(hào) (+)
不需要任何特殊處理,按平時(shí)的方式做就好了,比如下面測(cè)試的文件名。
$?touch?+12.txt文件名包含美元符 ($)
你需要將文件名用單引號(hào)括起來(lái),像處理分號(hào)那樣的方式。然后就很簡(jiǎn)單了。
$?touch?'$12.txt'文件名包含百分號(hào) (%)
不需要任何特殊處理,當(dāng)作一個(gè)普通文件就可以了。
$?touch?%12.txt文件名包含星號(hào) (*)
需要用單引號(hào)括起來(lái)或使用反斜杠轉(zhuǎn)義。(LCTT 譯注:此處原文有誤,已修改。)
$?touch?*12.txt注意:當(dāng)你需要?jiǎng)h除星號(hào)開頭的文件時(shí),千萬(wàn)不要用類似下面的命令。
$?rm?*或者$?rm?-rf?*而是用這樣的命令,(LCTT 譯注:此處原文有誤,已修改)
$?rm?./'*.txt'文件名包含嘆號(hào) (!)
只要將文件名用單引號(hào)括起來(lái),其他的就一樣了。
$?touch?'!12.txt'文件名包含小老鼠 (@)
沒(méi)有什么特別的,可以將名字包含小老鼠的文件當(dāng)作普通文件。
$?touch?'@12.txt'文件名包含 ^
不需要特殊處理。可以將名字包含 ^ 的文件當(dāng)作普通文件。
$?touch?^12.txt文件名包含 (&)
將文件名用單引號(hào)括起來(lái),然后就可以操作了。
$?touch?'&12.txt'文件名包含括號(hào) ()
如果文件名包含括號(hào),你需要將文件名用單引號(hào)括起來(lái)。
$?touch?'(12.txt)'文件名包含花括號(hào) {}
用單引號(hào)括起來(lái)或使用反斜杠轉(zhuǎn)義。(LCTT 譯注:此處原文有誤,已修改)
$?touch?'{12.txt}'文件名包含尖括號(hào) <>
名字包含尖括號(hào)的文件需要用單引號(hào)括起來(lái)。
$?touch?'<12.txt>'文件名包含方括號(hào) [ ]
用單引號(hào)括起來(lái)或使用反斜杠轉(zhuǎn)義。(LCTT 譯注:此處原文有誤,已修改)
$?touch?'[12.txt]'文件名包含下劃線 (_)
這個(gè)非常普遍,不需要特殊對(duì)待。當(dāng)作普通文件隨意處理。
$?touch?_12.txt文件名包含等號(hào) (=)
用單引號(hào)括起來(lái)或使用反斜杠轉(zhuǎn)義。(LCTT 譯注:此處原文有誤,已修改)
$?touch?'=12.txt'處理反斜杠 ()
反斜杠會(huì)告訴 shell 忽略后面字符的特殊含義。你必須將文件名用單引號(hào)括起來(lái),就像處理分號(hào)那樣。其他的就沒(méi)什么了。
$?touch?'\12.txt'包含斜杠的特殊情形
除非你的文件系統(tǒng)有問(wèn)題,否則你不能創(chuàng)建名字包含斜杠的文件。沒(méi)辦法轉(zhuǎn)義斜杠。
所以如果你能創(chuàng)建類似 ‘/12.txt’ 或者 ‘b/c.txt’ 這樣的文件,那要么你的文件系統(tǒng)有問(wèn)題,或者支持 Unicode,這樣你可以創(chuàng)建包含斜杠的文件。只是這樣并不是真的斜杠,而是一個(gè)看起來(lái)像斜杠的 Unicode 字符。
文件名包含問(wèn)號(hào) (?)
用單引號(hào)括起來(lái)或使用反斜杠轉(zhuǎn)義。(LCTT 譯注:此處原文有誤,已修改)
$?touch?'?12.txt'文件名包含點(diǎn) (.)
在 Linux 里以點(diǎn) (.) 開頭的文件非常特別,被稱為點(diǎn)文件。它們通常是隱藏的配置文件或系統(tǒng)文件。你需要使用 ls 命令的 ‘-a‘ 或 ‘-A‘ 開關(guān)來(lái)查看這種文件。
創(chuàng)建,編輯,重命名和刪除這種文件很直接。
$?touch?.12.txt注意:在 Linux 里你可能碰到名字包含許多點(diǎn) (.) 的文件。不像其他操作系統(tǒng),文件名里的點(diǎn)并不意味著分隔名字和擴(kuò)展后綴。你可以創(chuàng)建名字包含多個(gè)點(diǎn)的文件:
$?touch?1.2.3.4.5.6.7.8.9.10.txt檢查一下:
$?ls?-ltotal?0-rw-r--r--?1?avi?avi?0?Jun?8?14:32?1.2.3.4.5.6.7.8.9.10.txt文件名包含逗號(hào) (,)
你可以在文件名中使用逗號(hào),可以有任意多個(gè)而不用特殊對(duì)待。就像平時(shí)普通名字文件那樣處理。
$?touch?,12.txt或者$?touch?,12,.txt文件名包含冒號(hào) (:)
用單引號(hào)括起來(lái)或使用反斜杠轉(zhuǎn)義。(LCTT 譯注:此處原文有誤,已修改)
$?touch?':12.txt'或者$?touch?':12:.txt'文件名包含引號(hào)(單引號(hào)和雙引號(hào))
要在文件名里使用引號(hào),我們需要使用交替規(guī)則。例如,如果你需要在文件名里使用單引號(hào),那就用雙引號(hào)把文件名括起來(lái)。而如果你需要在文件名里使用雙引號(hào),那就用單引號(hào)把文件名括起來(lái)。(LCTT 譯注:或者如果單引號(hào)和雙引號(hào)混雜的情況,你也可以用反斜杠轉(zhuǎn)義。)
$?touch?"15'.txt"以及$?touch?'15".txt'文件名包含波浪號(hào) (~)
Linux 下一些像 emacs 這樣的文本編輯器在編輯文件的時(shí)候會(huì)創(chuàng)建備份文件。這個(gè)備份文件的名字是在原文件名后面附加一個(gè)波浪號(hào)。你可以在文件名任意位置使用波浪號(hào),例如:
$?touch?~1a.txt或者$touch?2b~.txt文件名包含空格
創(chuàng)建名字的字符/單詞之間包含空格的文件,比如 “hi my name is avishek.txt”。
最好不要在文件名里使用空格,如果你必須要分隔可讀的名字,可以使用下劃線或橫杠。不過(guò),你還是需要?jiǎng)?chuàng)建這樣的文件的話,你可以用反斜杠來(lái)轉(zhuǎn)義下一個(gè)字符。要?jiǎng)?chuàng)建上面名字的文件可以這樣做。
$?touch?hi\?my\?name\?is\?avishek.txthi?my?name?is?avishek.txt我已經(jīng)嘗試覆蓋你可能碰到的所有情況。上面大多數(shù)測(cè)試都在 BASH Shell 里完成,可能在其他 shell 下會(huì)有差異。
轉(zhuǎn)載于:https://blog.51cto.com/6226001001/1672643
總結(jié)
以上是生活随笔為你收集整理的Linux 下如何处理包含空格和特殊字符的文件名的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php可关于及||的非正常用法
- 下一篇: 操作系统概念学习笔记 16 内存管理(二