Linux技巧:ls命令只列出子目錄名和每行打印一個文件名


Linux技巧:ls命令只列出子目錄名和每行打印一個文件名

本篇文章介紹 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 選項會讓每行只打印一個文件名。


分享到:


相關文章: