自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux下如何處理包含空格和特殊字符的文件名

系統(tǒng) Linux
我們經(jīng)常會(huì)看到文件名和文件夾名。大多數(shù)時(shí)候文件/文件夾的名字和內(nèi)容相關(guān)并以數(shù)字和字母開頭。字母加數(shù)字的文件名最常見,應(yīng)用也很廣泛,但總會(huì)需要處理一些包含特殊字符的文件名/文件夾名。本文作者已經(jīng)嘗試覆蓋你可能碰到的所有情況。大多數(shù)測試都在BASH Shell里完成,可能在其他shell下會(huì)有差異。

我們經(jīng)常會(huì)看到文件名和文件夾名。大多數(shù)時(shí)候文件/文件夾的名字和內(nèi)容相關(guān)并以數(shù)字和字母開頭。字母加數(shù)字的文件名最常見,應(yīng)用也很廣泛,但總會(huì)需要處理一些包含特殊字符的文件名/文件夾名。

注意:我們可能有各種類型的文件,但是為了簡單以及方便實(shí)現(xiàn),在本文中我們只用文本文件(.txt)做演示。

[[140014]]

最常見的文件名例子:

  1. abc.txt
  2. avi.txt
  3. debian.txt
  4. ...

數(shù)字文件名例子:

  1. 121.txt
  2. 3221.txt
  3. 674659.txt
  4. ...

字母數(shù)字文件名例子:

  1. eg84235.txt
  2. 3kf43nl2.txt
  3. 2323ddw.txt
  4. ...

包含特殊字符的文件名的例子,并不常見:

  1. #232.txt
  2. #bkf.txt
  3. #bjsd3469.txt
  4. #121nkfd.txt
  5. -2232.txt
  6. -fbjdew.txt
  7. -gi32kj.txt
  8. --321.txt
  9. --bk34.txt
  10. ...

一個(gè)顯而易見的問題是 - 在這個(gè)星球上有誰會(huì)創(chuàng)建和處理包含井號(hào)(#),分號(hào)(;),破折號(hào)(-)或其他特殊字符的文件/文件夾??!

我和你想的一樣,這種文件名確實(shí)不常見,不過在你必須得處理這種文件名的時(shí)候你的 shell 也不應(yīng)該出錯(cuò)或罷工。而且技術(shù)上來說,Linux 下的一切比如文件夾、驅(qū)動(dòng)器或其他所有的都被當(dāng)作文件處理。

處理名字包含破折號(hào)(-)的文件

創(chuàng)建以破折號(hào)(-)開頭的文件,比如 -abx.txt。

  1. $ touch -abc.txt

測試輸出

  1. touch: invalid option -- 'b'
  2. Try 'touch --help' for more information.

出現(xiàn)上面錯(cuò)誤的原因是,shell 把破折號(hào)(-)之后的內(nèi)容認(rèn)作參數(shù)了,而很明顯沒有這樣的參數(shù),所以報(bào)錯(cuò)。

要解決這個(gè)問題,我們得告訴 Bash shell(是的,這里以及本文后面的大多數(shù)例子都是基于 BASH 環(huán)境)不要將特殊字符(這里是破折號(hào))后的字符解釋為參數(shù)。

有兩種方法解決這個(gè)錯(cuò)誤:

  1. $ touch -- -abc.txt [方法 #1]
  2. $ touch ./-abc.txt [方法 #2]

你可以通過運(yùn)行命令 ls 或 ls -l 列出詳細(xì)信息來檢查通過上面兩種方式創(chuàng)建的文件。

  1. $ ls -l
  2.  
  3. total 0
  4. -rw-r--r-- 1 avi avi 0 Jun 8 11:05 -abc.txt

要編輯上述文件可以這樣:

  1. $ nano -- -abc.txt
  2. 或者
  3. $ nano ./-abc.txt

注意:你可以將 nano 替換為任何其他你喜歡的編輯器比如說 vim:

  1. $ vim -- -abc.txt
  2. 或者
  3. $ vim ./-abc.txt

如果只是簡單地移動(dòng)文件可以這樣:

  1. $ mv -- -abc.txt -a.txt
  2. 或者
  3. $ mv -- -a.txt -abc.txt

刪除這種文件,可以這樣:

  1. $ rm -- -abc.txt
  2. 或者
  3. $ rm ./-abc.txt

如果一個(gè)目錄下有大量這種名字包含破折號(hào)的文件,要一次全部刪除的話,可以這樣:

  1. $ rm ./-*

重要:

  1. 上面討論的規(guī)則可以同樣應(yīng)用于名字中包含任意數(shù)量以及任意位置的連接符號(hào)的文件。就是說,-a-b-c.txt,ab-c.txt,abc-.txt,等等。

  2. 上面討論的規(guī)則可以同樣應(yīng)用于名字中包含任意數(shù)量以及任意位置連接符號(hào)的文件夾,除了一種情況,在刪除一個(gè)文件夾的時(shí)候你得這樣使用rm -rf

    $ rm -rf -- -abc 或者 $ rm -rf ./-abc

#p#

處理名字包含井號(hào)(#)的文件

符號(hào)#在 BASH 里有非常特別的含義。#之后的一切都會(huì)被認(rèn)為是評(píng)論,因此會(huì)被 BASH 忽略。

通過例子來加深理解:

創(chuàng)建一個(gè)名字是 #abc.txt 的文件:

  1. $ touch #abc.txt

測試輸出

  1. touch: missing file operand
  2. Try 'touch --help' for more information.

出現(xiàn)上面錯(cuò)誤的原因是,BASH 將 #abc.txt 解釋為評(píng)論而忽略了。所以命令 touch沒有收到任何文件作為參數(shù),所以導(dǎo)致這個(gè)錯(cuò)誤。

要解決這個(gè)問題,你可能需要告訴 BASH 不要將 # 解釋為評(píng)論。

  1. $ touch ./#abc.txt
  2. 或者
  3. $ touch '#abc.txt'

檢查剛創(chuàng)建的文件:

  1. $ ls -l
  2.  
  3. total 0
  4. -rw-r--r-- 1 avi avi 0 Jun 8 12:14 #abc.txt

現(xiàn)在創(chuàng)建名字中除了開頭的其他地方包含 # 的文件。

  1. $ touch ./a#bc.txt
  2. $ touch ./abc#.txt
  3. 或者
  4. $ touch 'a#bc.txt'
  5. $ touch 'abc#.txt'

運(yùn)行 ‘ls -l‘ 來檢查:

  1. $ ls -l
  2.  
  3. total 0
  4. -rw-r--r-- 1 avi avi 0 Jun 8 12:16 a#bc.txt
  5. -rw-r--r-- 1 avi avi 0 Jun 8 12:16 abc#.txt

如果同時(shí)創(chuàng)建兩個(gè)文件(比如 a 和 #bc)會(huì)怎么樣:

  1. $ touch a.txt #bc.txt

檢查剛創(chuàng)建的文件:

  1. $ ls -l
  2.  
  3. total 0
  4. -rw-r--r-- 1 avi avi 0 Jun 8 12:18 a.txt

很明顯上面的例子中只創(chuàng)建了文件 a 而文件 #bc 被忽略了。對(duì)于上面的情況我們可以這樣做,

  1. $ touch a.txt ./#bc.txt
  2. 或者
  3. $ touch a.txt '#bc.txt'

檢查一下:

  1. $ ls -l
  2.  
  3. total 0
  4. -rw-r--r-- 1 avi avi 0 Jun 8 12:20 a.txt
  5. -rw-r--r-- 1 avi avi 0 Jun 8 12:20 #bc.txt

可以這樣移動(dòng)文件:

  1. $ mv ./#bc.txt ./#cd.txt
  2. 或者
  3. $ mv '#bc.txt' '#cd.txt'

這樣拷貝:

  1. $ cp ./#cd.txt ./#de.txt
  2. 或者
  3. $ cp '#cd.txt' '#de.txt'

可以使用你喜歡的編輯器來編輯文件:

  1. $ vi ./#cd.txt
  2. 或者
  3. $ vi '#cd.txt'
  4.  
  5. $ nano ./#cd.txt
  6. 或者
  7. $ nano '#cd.txt'

這樣刪除:

  1. $ rm ./#bc.txt
  2. 或者
  3. $ rm '#bc.txt'

要?jiǎng)h除所有以井號(hào)(#)開頭的文件,可以這樣:

  1. # rm ./#*

#p#

處理名字包含分號(hào)(;)的文件

如果你還不知道的話,分號(hào)在 BASH 里起到命令分隔的作用,其他 shell 可能也是一樣的。分號(hào)作為分隔符可以讓你一次執(zhí)行幾個(gè)命令。你碰到過名字包含分號(hào)的文件嗎?如果沒有的話,這里有例子。

創(chuàng)建一個(gè)名字包含分號(hào)的文件。

  1. $ touch ;abc.txt

測試輸出

  1. touch: missing file operand
  2. Try 'touch --help' for more information.
  3. bash: abc.txt: command not found

出現(xiàn)上面錯(cuò)誤的原因是,在運(yùn)行上面命令的時(shí)候 BASH 會(huì)把 touch 解釋為一個(gè)命令但是在分號(hào)前沒有任何文件參數(shù),所以報(bào)告錯(cuò)誤。然后報(bào)告的另一個(gè)錯(cuò)誤找不到命令 abc.txt,只是因?yàn)樵诜痔?hào)后 BASH 會(huì)期望另一個(gè)新的命令,而 abc.txt 并不是一個(gè)命令。

要解決這個(gè)問題,我們得告訴 BASH 不要將分號(hào)解釋為命令分隔符,例如:

  1. $ touch ./';abc.txt'
  2. 或者
  3. $ touch ';abc.txt'

注意:我們將文件名用單引號(hào) '' 包含起來。這樣可以告訴 BASH 分號(hào) ; 是文件名的一部分而不是命令分隔符。

對(duì)名字包含分號(hào)的文件和文件夾的其他操作(就是,拷貝、移動(dòng)、刪除)可以直接將名字用單引號(hào)包含起來就好了。

處理名字包含其他特殊字符的文件/文件夾

文件名包含加號(hào) (+)

不需要任何特殊處理,按平時(shí)的方式做就好了,比如下面測試的文件名。

  1. $ touch +12.txt

文件名包含美元符 ($)

你需要將文件名用單引號(hào)括起來,像處理分號(hào)那樣的方式。然后就很簡單了。

  1. $ touch '$12.txt'

文件名包含百分號(hào) (%)

不需要任何特殊處理,當(dāng)作一個(gè)普通文件就可以了。

  1. $ touch %12.txt

文件名包含星號(hào) (*)

需要用單引號(hào)括起來或使用反斜杠轉(zhuǎn)義。(LCTT 譯注:此處原文有誤,已修改。)

  1. $ touch *12.txt

注意:當(dāng)你需要?jiǎng)h除星號(hào)開頭的文件時(shí),千萬不要用類似下面的命令。

  1. $ rm *
  2. 或者
  3. $ rm -rf *

而是用這樣的命令,(LCTT 譯注:此處原文有誤,已修改)

  1. $ rm ./'*.txt'

文件名包含嘆號(hào) (!)

只要將文件名用單引號(hào)括起來,其他的就一樣了。

  1. $ touch '!12.txt'

文件名包含小老鼠 (@)

沒有什么特別的,可以將名字包含小老鼠的文件當(dāng)作普通文件。

  1. $ touch '@12.txt'

文件名包含 ^

不需要特殊處理。可以將名字包含 ^ 的文件當(dāng)作普通文件。

  1. $ touch ^12.txt

文件名包含 (&)

將文件名用單引號(hào)括起來,然后就可以操作了。

  1. $ touch '&12.txt'

文件名包含括號(hào) ()

如果文件名包含括號(hào),你需要將文件名用單引號(hào)括起來。

  1. $ touch '(12.txt)'

文件名包含花括號(hào) {}

用單引號(hào)括起來或使用反斜杠轉(zhuǎn)義。(LCTT 譯注:此處原文有誤,已修改)

  1. $ touch '{12.txt}'

文件名包含尖括號(hào) <>

名字包含尖括號(hào)的文件需要用單引號(hào)括起來。

  1. $ touch '<12.txt>'

文件名包含方括號(hào) [ ]

用單引號(hào)括起來或使用反斜杠轉(zhuǎn)義。(LCTT 譯注:此處原文有誤,已修改)

  1. $ touch '[12.txt]'

#p#

文件名包含下劃線 (_)

這個(gè)非常普遍,不需要特殊對(duì)待。當(dāng)作普通文件隨意處理。

  1. $ touch _12.txt

文件名包含等號(hào) (=)

用單引號(hào)括起來或使用反斜杠轉(zhuǎn)義。(LCTT 譯注:此處原文有誤,已修改)

  1. $ touch '=12.txt'

處理反斜杠 ()

反斜杠會(huì)告訴 shell 忽略后面字符的特殊含義。你必須將文件名用單引號(hào)括起來,就像處理分號(hào)那樣。其他的就沒什么了。

  1. $ touch '\12.txt'

包含斜杠的特殊情形

除非你的文件系統(tǒng)有問題,否則你不能創(chuàng)建名字包含斜杠的文件。沒辦法轉(zhuǎn)義斜杠。

所以如果你能創(chuàng)建類似 ‘/12.txt’ 或者 ‘b/c.txt’ 這樣的文件,那要么你的文件系統(tǒng)有問題,或者支持 Unicode,這樣你可以創(chuàng)建包含斜杠的文件。只是這樣并不是真的斜杠,而是一個(gè)看起來像斜杠的 Unicode 字符。

文件名包含問號(hào) (?)

用單引號(hào)括起來或使用反斜杠轉(zhuǎn)義。(LCTT 譯注:此處原文有誤,已修改)

  1. $ touch '?12.txt'

文件名包含點(diǎn) (.)

在 Linux 里以點(diǎn) (.) 開頭的文件非常特別,被稱為點(diǎn)文件。它們通常是隱藏的配置文件或系統(tǒng)文件。你需要使用 ls 命令的 ‘-a‘ 或 ‘-A‘ 開關(guān)來查看這種文件。

創(chuàng)建,編輯,重命名和刪除這種文件很直接。

  1. $ touch .12.txt

注意:在 Linux 里你可能碰到名字包含許多點(diǎn) (.) 的文件。不像其他操作系統(tǒng),文件名里的點(diǎn)并不意味著分隔名字和擴(kuò)展后綴。你可以創(chuàng)建名字包含多個(gè)點(diǎn)的文件:

  1. $ touch 1.2.3.4.5.6.7.8.9.10.txt

檢查一下:

  1. $ ls -l
  2.  
  3. total 0
  4. -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í)普通名字文件那樣處理。

  1. $ touch ,12.txt
  2. 或者
  3. $ touch ,12,.txt

文件名包含冒號(hào) (:)

用單引號(hào)括起來或使用反斜杠轉(zhuǎn)義。(LCTT 譯注:此處原文有誤,已修改)

  1. $ touch ':12.txt'
  2. 或者
  3. $ touch ':12:.txt'

文件名包含引號(hào)(單引號(hào)和雙引號(hào))

要在文件名里使用引號(hào),我們需要使用交替規(guī)則。例如,如果你需要在文件名里使用單引號(hào),那就用雙引號(hào)把文件名括起來。而如果你需要在文件名里使用雙引號(hào),那就用單引號(hào)把文件名括起來。(LCTT 譯注:或者如果單引號(hào)和雙引號(hào)混雜的情況,你也可以用反斜杠轉(zhuǎn)義。)

  1. $ touch "15'.txt"
  2.  
  3. 以及
  4.  
  5. $ touch '15".txt'

文件名包含波浪號(hào) (~)

Linux 下一些像 emacs 這樣的文本編輯器在編輯文件的時(shí)候會(huì)創(chuàng)建備份文件。這個(gè)備份文件的名字是在原文件名后面附加一個(gè)波浪號(hào)。你可以在文件名任意位置使用波浪號(hào),例如:

  1. $ touch ~1a.txt
  2. 或者
  3. $touch 2b~.txt

文件名包含空格

創(chuàng)建名字的字符/單詞之間包含空格的文件,比如 “hi my name is avishek.txt”。

***不要在文件名里使用空格,如果你必須要分隔可讀的名字,可以使用下劃線或橫杠。不過,你還是需要?jiǎng)?chuàng)建這樣的文件的話,你可以用反斜杠來轉(zhuǎn)義下一個(gè)字符。要?jiǎng)?chuàng)建上面名字的文件可以這樣做。

  1. $ touch hi\ my\ name\ is\ avishek.txt
  2.  
  3. hi my name is avishek.txt

我已經(jīng)嘗試覆蓋你可能碰到的所有情況。上面大多數(shù)測試都在 BASH Shell 里完成,可能在其他 shell 下會(huì)有差異。

如果你覺得我遺漏了什么(這很正常也符合人性),請(qǐng)把你的建議發(fā)表到下面的評(píng)論里。保持聯(lián)系,多評(píng)論。不要走開!求點(diǎn)贊求分享求擴(kuò)散!

責(zé)任編輯:火鳳凰 來源: LCTT
相關(guān)推薦

2023-02-09 08:12:41

Linux文件空格

2009-06-29 09:57:05

Unix

2012-12-24 15:00:56

sis塞班

2009-08-06 16:10:36

C#字符串處理

2021-03-16 12:42:42

FreeDOS開源

2020-12-29 09:11:33

LinuxLinux內(nèi)核

2018-03-28 17:51:24

LinuxUnix

2009-05-14 10:44:54

JQuery特殊字符ID選擇器

2022-09-28 08:18:01

I/ONIO2API

2009-12-25 16:53:25

Linux Bash命

2009-06-17 09:01:29

Linuxshell特殊字符

2024-03-26 09:40:53

Linux優(yōu)化

2010-06-23 16:14:52

Linux Bash

2009-12-15 13:15:11

Ruby字符串

2010-02-23 17:12:01

WCF字符串

2019-11-21 14:56:40

特殊文件Linux開發(fā)

2022-11-10 15:17:43

Windows文件Linux

2010-09-07 10:19:31

SQL語句

2012-10-09 16:37:20

FastDFS

2018-06-22 15:46:45

Spring Clou加密處理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)