find name 檔案萬用字元必須使用雙引號

2021-09-16 18:46:52 字數 1453 閱讀 7219

shell萬用字元易出錯點

這裡的*都是shell的檔案萬用字元,包括 * ?

首先檔案萬用字元和正規表示式含義是不同的。最大的差別在於:

1."*" 在正規表示式中表示前面的字元重複任意次數,所以表示任意字串".*", shell萬用字元中* 就表示任意字串

2. ".「在正規表示式中是任意乙個字元,在萬用字元中沒有其他任何含義,在萬用字元中」?"表示乙個任意的字元

shell 本身會對*進行解析,所以如果不希望shell解析"*", 就一定要把萬用字元用雙引號括起來(單引號使用後,就什麼都替換不了)

ls -l ab* 這個*由shell來解析的,假如目錄下面有ab1 abc ab2, 那這個命令首先會被shell轉化為ls -l ab1 abc ab2。 ls本身沒有解析萬用字元的能力。

ls -l 「ab*」, 那就會什麼都沒有,因為沒有乙個檔案的名字是ab*

find . -name "abc*"這個引數會原封不動的傳給find, find命令本身具備解析萬用字元的能力,會在當前目錄下面的各級目錄下面尋找以abc開頭的檔案。

find . -name abc* 那萬用字元會被shell解析,如果當前目錄下沒有以abc開頭的檔案,那傳給find命令的就是空的,相當於:

find . -name

find: missing argument to `-name』

如果當前目錄下游多個abc開頭的檔案,會出錯,相當於:

find . -name abc1 abc2

find: paths must precede expression: abc2 就是說第二個name前面沒有指定尋找的路徑,

如果當前目錄下面只有乙個abc開頭的檔案,那就不會出錯,但是相當於:

find . -name abc1

最終最在所有的目錄下面搜尋abc1的檔案,和我們的本意大相徑庭。

記住,-name選項搜尋的是basename,不要再裡面帶"/"

再提一下grep. grep [-option] pattern file

這裡的pattern是正規表示式,必須用雙引號 括起來,否則被shell解析。file部分沒有pattern,所以grep自己的檔案是沒有解析能力的,file裡面如果有萬用字元,必須由shell解析,可見得檔案部分的萬用字元必須沒有雙引號。

grep -i 「main.*hello」 .c

在當前的目錄下的所有的c原始檔中搜尋同時含有main和hello的語句

shell本身的檔案萬用字元解析的能力比較弱,只對當前目錄下的檔案有效。

要想對多層目錄有效:

grep -r 『hello』 /home/gigi

但是這個不能指定檔案的名稱,再指定檔名稱的pattern

find /home/gigi -name '.c』 -print0 | xargs -0r grep -h 『hello』

grep -rh --include=』*.c』 『hello』 /home/gigi

Python 萬用字元刪除檔案

coding utf 8 使用萬用字元,獲取所有檔案,或進行操作。import glob import os deffiles curr dir ext exe 當前目錄下的檔案 for i in glob.glob os.path.join curr dir,ext yield i defall ...

檔名萬用字元

1 單字元匹配元字元 元字元 表示匹配檔名中任意乙個字元,連續使用多個元字元 可以表示多個任意字元。1 例如要檢視有兩個字元且第乙個字母是a的檔案 root localhost zhu ls l a?rw r r 1 root root 0 dec 6 09 46 ab rw r r 1 root ...

linux 檔案管理 3 檔案萬用字元

ll proc meminfo 大小為0,不是硬碟檔案。在記憶體裡,只不過以檔案的方式顯示出來給我們看。ls conf ls f?conf ls ls mage ls 前乙個工作目錄 ls 當前 ls f?0 9 touch a.txt ll a 0 9 txt ls b acz txt ls b ...