本篇文章介紹 Linux ls 命令如何只列出指定目錄下的子目錄名,和每行只打印一個文件名的方法。
只列出指定目錄下的子目錄名
在 ls 命令中只列出子目錄名
在 Linux 中,ls 命令默認會列出所給目錄下的所有文件名,包括子目錄名。如果只想列出當前目錄下的子目錄名,可以使用 ls -d */ 命令。
具體舉例說明如下:
<code>$ ls test_dir test_text $ ls -d */ test_dir/ $ ls -d * test_dir test_text /<code>
在這個例子中,當前目錄下有一個 test_dir 子目錄、和一個 test_text 文本文件。
可以看到,ls -d */ 命令只列出 test_dir 子目錄名,且目錄名以 / 結尾。
而 ls -d * 命令還是列出了當前目錄下的所有文件名。
後面會說明這兩個命令的區別。
查看 info ls 對 -d 選項的說明如下:
-d, --directory
List just the names of directories, as with other types of files, rather than listing their contents.
即,ls -d 選項只列出所給參數自身的名稱。如果參數中包含目錄名,只列出該目錄名,不再列出該目錄下的所有文件名。如果參數中包含文件名,則列出該文件名。
注意:ls 命令的參數是目錄名時,默認是列出該目錄下的文件名,包括子目錄名。如果沒有任何參數,默認使用 ‘.’ 這個參數,也就是列出當前目錄下的文件名。
而 ls -d 選項改變了這個行為,不再獲取所給目錄下的文件信息,只列出所給的目錄名。
具體舉例說明如下:
<code>$ ls test_dir test_text $ ls -d . $ ls test_dir $ ls -d test_dir test_dir /<code>
跟上面例子一樣,當前目錄下有一個 test_dir 子目錄、和一個 test_text 文本文件。
ls 命令不提供任何參數時,相當於 ls . 命令,列出當前目錄下的文件信息。
ls -d 命令只打印了一個 .,對應當前目錄。
ls -d 相當於 ls -d . 命令,而 -d 選項指定列出所給目錄名,不列出目錄下的文件,所以打印出一個 ‘.’。
ls test_dir 目錄打印為空,因為 test_dir 是一個空目錄,該目錄下沒有文件。
ls -d test_dir 目錄打印了 test_dir,也就是所給的 test_dir 目錄名。
基於上面說明,打開 bash 的調試信息後,可以看到 ls -d */ 命令和 ls -d * 命令的區別如下:
<code>$ set -x $ ls -d */ + ls --color=auto -d test_dir/ test_dir/ $ ls -d * + ls --color=auto -d test_dir test_text test_dir test_text $ set +x /<code>
可以看到,*/ 擴展之後的結果是 test_dir/,只有子目錄名,沒有文本文件名。那麼 ls -d test_dir/ 只列出了這個目錄名。
而 * 擴展之後的結果是 test_dir test_text,包含子目錄名和文本文件名。那麼 ls -d test_dir test_text 會列出所給的子目錄名和文件文件名。
使用星號 * 通配符來獲取子目錄名
上面兩個命令最大的區別在於 */ 和 * 的路徑名擴展結果不同。
查看 man bash 的 Pathname Expansion 小節,對此說明如下:
If followed by a /, two adjacent *s will match only directories and subdirectories.
即,當星號 * 通配符後面跟著 / 字符時,路徑名擴展結果只有目錄名和子目錄名。
如果只是想獲取當前目錄下的子目錄名,直接為賦值為 */ 即可,不要用引號括起來。
具體舉例如下:
<code>$ subdirs=*/ $ echo $subdirs test_dir/ /<code>
可以看到,subdirs=*/ 語句會把 subdirs 變量賦值為當前目錄下的子目錄名,目錄名會以 / 結尾。
當在 shell 腳本中使用時,由於執行 shell 腳本的工作目錄可能不固定,可以通過絕對路徑來尋址。
具體舉例如下:
<code>$ subdirs=/home/sample/*/ $ echo $subdirs /home/sample/test_dir/ /<code>
使用 ls -1 逐行列出文件名
一般來說,ls 命令會在一行中打印多個文件名。如果想要每行只打印一個文件名,可以使用 -1 選項。注意,這裡是數字 1,而不是字母 l。
查看 man ls 對 -1 選項說明如下:
-1
list one file per line. Avoid '\n' with -q or -b
即,-1 選項會讓每行只打印一個文件名。