要列出目前目錄下所有的檔案名和目錄名直接使用ls指令即可。
但如何隻列出檔案名而不列出目錄呢?
查遍了ls 的幫助,也沒看到有這個現成的選項。
幸好這個問題還是比較常見的,網上已經有了一些解答,但實驗之後,我發現看到的幾個連結給出的解決方法都是不完全正确的。具體如下。
一、網上流傳的解法
首先,ls -l 指令可以列出如下格式的完整資訊:
drwxr-xr-x 4 junfeng junfeng 4096 2009-11-26 01:04 bin
-rw-r--r-- 1 junfeng junfeng 103 2009-11-26 13:35 cmakelists.txt
drwxr-xr-x 2 junfeng junfeng 4096 2009-11-26 01:06 src
可以看到,檔案和目錄的差別在于第一列是d還是-。這就需要在ls的基礎上使用grep指令來對ls輸出的每一行進行過濾。進一步使用ls -l | grep ^[^d]或者 ls -l | grep -v ^d 指令得到如下結果:
現在目錄被過濾掉了。grep ^[^d]中,^[^d] 是一個正規表達式,[^d]表示字元串含有一個不是d的字元,^d表示以d開頭,^[^d]表示不以d開頭。
但有時候隻需要獲得檔案名,需要進一步排除權限,日期等資訊,那麼再進一步加入awk指令。
ls -l | grep ^[^d] | awk '{print $8}'
結果如下:
cmakelists.txt
重新觀察之前的結果
awk '{print $8}' 中 數字8的含義是第8列(列和列之間以空格符分割),也就是檔案名cmakelist.txt這一部分,
二、此方法的漏洞分析和正确的方法(可能)
上述方法有一個重要的漏洞,那就是使用了awk '{print $8}'指令。前面提到這個指令是以空格符來判斷列和列的分隔的。那麼如果檔案名中就包含空格會怎麼樣呢
繼續實驗一下。 運作touch "f ile"建立一個名為"f ile"的檔案。注意檔案名中的空格。
再重新運作
f
果然得到了錯誤的結果。
仔細閱讀文檔,發現一個可行而且比較簡便的方法:
ls -1 -f | grep -v [/$]
解釋如下:
ls -1 , 注意這裡是數字1,作用是單列輸出。
ls -f:根據檔案、目錄等資訊在檔案名或目錄名最後給予附加資料結構,例如:
*代表可執行檔案;/代表目錄;=代表socket檔案;|代表fifo檔案;@代表連接配接檔案
ls的輸出:
bin cmakelists.txt f ile src
ls -1的輸出:
bin
f ile
src
下面看ls -f的輸出
bin/ cmakelists.txt f ile src/
可見目錄項的結尾被添加了 '/' 字元。這樣便能夠簡單的區分目錄和檔案了。
而 grep -v [/$],[/$]表達式比對的是以'/'結尾的字元串,而-v選項則是排除這些比對的字元串。
最後給出linux下正确的隻列出目前目錄下檔案名的方法如下:
ls -1 -f | grep - v[/$]
在我們的例子中執行這個指令的輸出如下:
linux下正确的隻列出目前目錄下目錄名的方法
1、一般情況下可使用 ls -l | grep ^d ,若隻列出目錄名: ls -l | grep ^d | awk '{print $8}'
2、若目錄名中有空格,可使用ls -f | grep [/$],不能寫成 ls -f | grep [*/$], [*/$]表示以*或者/結尾都可以
3、一個最簡單的方法,使用 ls -d */,可以達到與方法2相同的效果,如 ls -d /boot/*/,列出/boot/下的目錄名,顯示結果為/boot/grub/
4、方法2與方法3可以避免目錄名中有空格,但列出的目錄名最後有一個“/”,若想删除最後的那個"/",可使用sed指令做如下處理,以方法3為例,
ls -d /boot/*/ | sed 's/\///g'
sed 's/old/new/g':以行為機關進行查找替換,注意:要删除“/”需要使用轉義字元
原始位址:http://hi.baidu.com/iovsdplqyybgrwq/item/666923595795ae9c8c12edb2