2012-12-28 59 views
2

我有一個excersise中,我要打印包含在當前文件夾中的所有文件名,其中包含的字母[a-k]的其中之一,[m-p][1-9] ATLEAST 1次(每)。我可能不得不使用ls(glob-style)猛砸LS(通配符式樣)

+0

我會用'grep'和正則表達式:'LS -1 | grep -E「your_regex」' – Blender

+0

好吧,我不知道是什麼正則表達式,而且我實際上必須使用ls我認爲.. thx – user1923376

+0

這個功課是? – fbynite

回答

3

如果順序很重要,那麼你可以使用通配符:

$ ls *[a-k]*[m-p]*[1-9]* 
ajunk404 am1 cn5 

否則爲每個組分別只grep

ls | grep "[a-k]" | grep "[m-p]" | grep "[1-9]" 
1ma 
ajunk404 
am1 
cn5 
m1a 

注:ls將顯示的目錄,如果你真的只想文件使用find裏面:

find . -maxdepth 1 -type f | grep "[a-k]" | grep "[m-p]" | grep "[1-9]" 
0

如果順序不重要,並且字母出現一次或多次,可以使用鏈接greps。

ls | egrep "[a-k]" | egrep "[m-p]" | egrep "[1-9]" 

如果順序的問題,那麼就使用的glob模式

ls *[a-k]*[m-p]*[1-9]* 
1

100%純慶典(和有趣!)可能性:

#!/bin/bash 

shopt -s nullglob 
a=(*[a-k]*) 
b=(); for i in "${a[@]}"; do [[ "$i" = *[p-z]* ]] && b+=("$i"); done 
c=(); for i in "${b[@]}"; do [[ "$i" = *[1-9]* ]] && c+=("$i"); done 
printf "%s\n" "${c[@]}" 

無需外接任何處理!沒有管道!只有純粹的bash!對於名稱中帶有有趣符號的文件(例如換行符),100%安全(其他方法使用ls則不是這種情況)。如果你想真正看到在文件名中的搞笑符號,讓他們正確地引用,以便重用的輸出,以代替過去printf語句的使用

printf "%q\n" "${c[@]}" 

注意。模式[a-k],[p-z]是區域設置相關的。您可能需要設置LC_ALL=C以確保[a-k]的確表示[abcdefghijk]而不是其他內容,例如[aAbBcCdDeEfFgGhHiIjJk]

希望這會有所幫助!

0

是完整的,你需要搜索所有的組合:

ls *[a-k]*[m-p]*[1-9]* *[a-k]*[1-9]*[m-p]* \ 
    *[m-p]*[a-k]*[1-9]* *[m-p]*[1-9]*[a-k]* \ 
    *[1-9]*[m-p]*[a-k]* *[1-9]*[a-k]*[m-p]*