2009-10-19 48 views
10

據我所知,通配符*(本身)將以這樣的方式展開,即它表示「當前文件夾中的所有非隱藏文件」,隱藏文件是以句點爲前綴的文件。Bash globbing - autoexpand的幾個特定情況?

有,我會覺得是有用的兩個用例,但我不知道如何正確地做:

  1. 你怎麼能在當前文件夾爲glob的......「所有文件,包括隱藏文件,但不包括...「?

  2. 你怎麼能glob ......「當前文件夾中的所有隱藏文件(只有隱藏文件),但不包括...」?

回答

15

要擴大paviums answer並回答你問題的第二部分,除了...所有文件可以這樣指定:

{.[!.]*,*} 

根據您的具體使用情況下,它可能會更好,設置dotglob外殼選項,這樣的bash默認包含在*擴展點文件:

$ shopt -s dotglob 
$ echo * 
.tst 
+2

'{..?* ,. [^。] *,[^。] *}'不管'dotglob'設置如何,都可以工作,並避免缺少以兩個點開始的文件名,這在這裏似乎都錯過了。 – ephemient 2009-10-19 16:06:48

+1

@ephemient:這給了我一個虛假的匹配'..?*'當沒有以兩個點開始的文件名時。 – 2011-05-06 07:51:25

3

Bash Cookbook建議您的第二個要求的解決方案。

.[!.]* 

爲指定「點文件」,但避免...

當然的一種方式,ls-A選項,但是這不是通配符。

+2

'觸摸..blah; echo {。,} [!。] * | grep blah'失敗。 – ephemient 2009-10-19 16:01:41

1

爲了滿足您的第一種情況:

echo {.,}[^.]* 

echo {.,}[!.]* 

編輯

這一次似乎得到一切,但短於ephemient

echo {.*,}[^.]* 
+2

'touch ..blah; echo {。,} [^。] * | grep blah'失敗。 – ephemient 2009-10-19 16:02:12

0

通過 「所有文件」和「所有隱藏的文件」,你的意思是文件只,或者你的意思是兩個f iles和目錄?無論屬於文件還是目錄,Globbing都會對名稱進行操作。其他人爲使用globbing找到隱藏名稱和非隱藏名稱提供了很好的答案,但您可能希望轉到find命令,作爲可以區分這兩種類型的更簡單的替代方法。

找到「所有文件在當前文件夾,包括隱藏文件,但不包括或..」:

find . -type f 

要找到「所有文件和目錄在當前文件夾,包括隱藏文件,但不包括。或..「:

find . ! -name . 

在當前文件夾中查找」所有隱藏文件(僅隱藏文件)「,但不包括。或..「:

find . -name '.*' -type f 

找到」在當前文件夾中的所有隱藏文件和目錄(只有隱藏的文件和目錄),但不包括。或..「:

find . -name '.*' ! -name . 

注意,默認情況發現將通過遞歸子目錄,太,所以如果你想將它限制爲僅當前目錄下,你可以使用:

find . -maxdepth 1 -type f 
1

結合......而pavium回答

# dot files but avoiding . and .. 
.[!.]* 

# all files but avoiding . and .. 
{.[!.]*,*} 
0

所以,即使這是老 - 不使用禁用了javascript,這似乎並沒有被完全回答但是,擴大什麼已經給出答案,到目前爲止,這些工作對我來說:。

1:

{*,.[!.]*,..?*}

2:

{.[!.]*,..?*}