2010-05-26 92 views
28

我經常需要對目錄中的所有文件(包括隱藏文件)執行命令。當我嘗試使用如何在bash中使用。*通配符但排除父目錄(..)?

chmod g+w * .* 

它改變父目錄上的所有我想要的文件的權限(目錄)和所有的文件(我想單獨留在家中)。

是否有一個通配符可以做正確的事情,還是我需要開始使用find?

回答

37

您將需要兩個全局模式來覆蓋所有潛在的「點文件」:.[^.]*..?*

第一個匹配所有具有兩個或更多字符的目錄條目,其中第一個字符是點,第二個字符不是點。第二個選項包含三個或更多以..開頭的字符(這不包括..,因爲它只有兩個字符並以.開頭,但包含(不太可能)如..foo)。

chmod g+w .[^.]* ..?* 

這應該適用於大多數所有shell並適用於腳本。


對於常規的交互式使用,模式可能太難記了。對於這些情況,您的shell可能有一個更方便的方法來跳過...zsh總是從.*等圖案中排除...。 With bash,您必須使用GLOBIGNORE shell變量。

# bash 
GLOBIGNORE=.:.. 
echo .* 

你可能會考慮在的bash自定義文件(例如.bash_profile/.bash_login.bashrc)的一個設置GLOBIGNORE。 但是,請注意,如果您經常使用其他環境,則習慣於此定製。 如果在缺少自定義的環境中運行類似chmod g+w .*的命令,則會意外地在命令中包含...

此外,您可以將shell配置爲在不以明確點開頭的模式中包含「點文件」(例如*)。

# zsh 
setopt glob_dots 

# bash 
shopt -s dotglob 


# show all files, even 「dot files」 
echo * 
+5

實際上,GLOBIGNORE是一個很好的文件夾。如果你不想永久使用'(GLOBIGNORE = ..; echo。*)',你可以暫時使用它。僅爲那一小段信息+1。 – paxdiablo 2010-05-26 05:00:03

+5

有一個與'。[^。] * ..?''glob的警告,它通常會抱怨不匹配..?*部分,除非你購買了nullglob。 – pixelbeat 2012-04-12 08:27:27

2

通常我只想用. .[a-zA-Z0-9]*因爲我的文件名往往會遵循一定的規則,但不會趕上所有可能的情況。

可以使用:

chmod g+w $(ls -1a | grep -v '^..$') 

這將基本上列出所有的文件和目錄,去掉父目錄,然後處理其餘部分。注意文件名中的空格,但會將它們視爲單獨的文件。

當然,如果你只想做文件,你可以使用:

find . -maxdepth 0 -type f -exec chmod g+w {} ';' 

,或者另一種解決方案,它應該做的所有文件和目錄,除了..一個:

for i in * .* ; do if [[ ${i} != ".." ]] ; then chmod g+w "$i"; fi done 

但現在您正在進入可能需要腳本或別名的領域。

+0

只是刪除的grep -v「^ $」。因爲艾倫想要隱藏的文件,但不是父文件夾 – 2010-05-26 04:33:50

1

如何:

shopt -s dotglob 
chmod g+w ./* 
1

既然你可能不希望設置dotglob您的bash會話的其餘部分,你可以通過像這樣子進程運行設置了一組命令:

$ (shopt -s dotglob; chmod g+w ./*) 
2

我做什麼

tar --directory my_directory --file my_directory.tar --create `ls -A mydirectory/` 

工程就好了ls -A my_directory擴展到目錄中除...以外的所有內容。沒有奇怪的球,並在一條線上。

ps:也許有人會告訴我爲什麼這不是一個好主意。 :P

+0

是的,它工作正常(在ls中的'幾乎所有'選項,但是,這樣做,你現在開始另一個過程,在這種情況下/ bin/ls ..通常不是一個壞主意,但是,如果你正在工作說10,000 +目錄,它可以開始佔用一點資源 - globbing由shell完成,並且不啓動任何進程來提供列表,並且實際上大多數人可以通過使用*。[^。 ] *基本上看起來像一個帶單片眼鏡的禿頭男人,所以很容易記住(加上它與正則表達式很相似,現在不是每個人都知道正則表達式嗎?或者我在這裏不是這樣:)> – osirisgothra 2013-08-13 09:11:49

+1

如果文件名包含空格。 – 2013-11-26 18:58:33

0

如果您確信兩個字符的隱藏文件名字永遠不會被使用,那麼最簡單的選項,只是做的事:

chmod g+w * ...*