精通 Linux 的 ls 命令
Linux 的 ls 命令擁有數量驚人的選項,可以提供有關檔案的重要資訊。
ls
命令可以列出一個 POSIX 系統上的檔案。這是一個簡單的命令,但它經常被低估,不是它能做什麼(因為它確實只做了一件事),而是你該如何優化對它的使用。
要知道在最重要的 10 個終端命令中,這個簡單的 ls
命令可以排進前三,因為 ls
不會只是列出檔案,它還會告訴你有關它們的重要資訊。它會告訴你諸如擁有檔案或目錄的人、每個檔案修改的時間、甚至是什麼型別的檔案。它的附帶功能能讓你瞭解你在哪裡、附近有些什麼,以及你可以用它們做什麼。
如果你對 ls
的體驗僅限於你的發行版在 .bashrc
中的別名,那麼你可能錯失了它。
GNU 還是 BSD?
在瞭解 ls
的隱藏能力之前,你必須確定你正在執行哪個 ls
命令。有兩個最流行的版本:包含在 GNU coreutils 包中的 GNU 版本,以及 BSD 版本。如果你正在執行 Linux,那麼你很可能已經安裝了 GNU 版本的 ls
(LCTT 譯註:幾乎可以完全確定)。如果你正在執行 BSD 或 MacOS,那麼你有的是 BSD 版本。本文會介紹它們的不同之處。
你可以使用 --version
選項找出你計算機上的版本:
$ ls --version
如果它返回有關 GNU coreutils 的資訊,那麼你擁有的是 GNU 版本。如果它返回一個錯誤,你可能正在執行的是 BSD 版本(執行 man ls | head
以確定)。
你還應該調查你的發行版可能具有哪些預設選項。終端命令的自定義通常放在 $HOME/.bashrc
或 $HOME/.bash_aliases
或 $HOME/.profile
中,它們是通過將 ls
別名化為更復雜的 ls
命令來完成的。例如:
alias ls='ls --color'
發行版提供的預設非常有用,但它們確實很難分辨出哪些是 ls
本身的特性,哪些是它的附加選項提供的。你要是想要執行 ls
命令本身而不是它的別名,你可以用反斜槓“轉義”命令:
$ \ls
分類
單獨執行 ls
會以適合你終端的列數列出檔案:
$ ls ~/example
bunko jdk-10.0.2
chapterize otf2ttf.ff
despacer overtar.sh
estimate.sh pandoc-2.7.1
fop-2.3 safe_yaml
games tt
這是有用的資訊,但所有這些檔案看起來基本相同,沒有方便的圖示來快速表示出哪個是目錄、文字檔案或影像等等。
使用 -F
(或 GNU 上的長選項 --classify
)以在每個條目之後顯示標識檔案型別的指示符:
$ ls ~/example
bunko jdk-10.0.2/
chapterize* otf2ttf.ff*
despacer* overtar.sh*
estimate.sh pandoc@
fop-2.3/ pandoc-2.7.1/
games/ tt*
使用此選項,終端中列出的專案使用簡寫符號來按檔案型別分類:
- 斜槓(
/
)表示目錄(或“資料夾”)。 - 星號(
*
)表示可執行檔案。這包括二進位制檔案(編譯程式碼)以及指令碼(具有可執行許可權的文字檔案)。 - 符號(
@
)表示符號連結(或“別名”)。 - 等號(
=
)表示套接字。 - 在 BSD 上,百分號(
%
)表示塗改(某些檔案系統上的檔案刪除方法)。 - 在 GNU 上,尖括號(
>
)表示門(Illumos 和 Solaris上的程式間通訊)。 - 豎線(
|
)表示 FIFO 管道。 這個選項的一個更簡單的版本是-p
,它只區分檔案和目錄。
(LCTT 譯註:在支援彩色的終端上,使用 --color
選項可以以不同的顏色來區分檔案型別,但要注意如果將輸出匯入到管道中,則顏色消失。)
長列表
從 ls
獲取“長列表”的做法是如此常見,以至於許多發行版將 ll
別名為 ls -l
。長列表提供了許多重要的檔案屬性,例如許可權、擁有每個檔案的使用者、檔案所屬的組、檔案大小(以位元組為單位)以及檔案上次更改的日期:
$ ls -l
-rwxrwx---. 1 seth users 455 Mar 2 2017 estimate.sh
-rwxrwxr-x. 1 seth users 662 Apr 29 22:27 factorial
-rwxrwx---. 1 seth users 20697793 Jun 29 2018 fop-2.3-bin.tar.gz
-rwxrwxr-x. 1 seth users 6210 May 22 10:22 geteltorito
-rwxrwx---. 1 seth users 177 Nov 12 2018 html4mutt.sh
[...]
如果你不想以位元組為單位,請新增 -h
標誌(或 GNU 中的 --human
)以將檔案大小轉換為更加人性化的表示方法:
$ ls --human
-rwxrwx---. 1 seth users 455 Mar 2 2017 estimate.sh
-rwxrwxr-x. 1 seth seth 662 Apr 29 22:27 factorial
-rwxrwx---. 1 seth users 20M Jun 29 2018 fop-2.3-bin.tar.gz
-rwxrwxr-x. 1 seth seth 6.1K May 22 10:22 geteltorito
-rwxrwx---. 1 seth users 177 Nov 12 2018 html4mutt.sh
要看到更少的資訊,你可以帶有 -o
選項只顯示所有者的列,或帶有 -g
選項只顯示所屬組的列:
$ ls -o
-rwxrwx---. 1 seth 455 Mar 2 2017 estimate.sh
-rwxrwxr-x. 1 seth 662 Apr 29 22:27 factorial
-rwxrwx---. 1 seth 20M Jun 29 2018 fop-2.3-bin.tar.gz
-rwxrwxr-x. 1 seth 6.1K May 22 10:22 geteltorito
-rwxrwx---. 1 seth 177 Nov 12 2018 html4mutt.sh
也可以將兩個選項組合使用以顯示兩者。
時間和日期格式
ls
的長列表格式通常如下所示:
-rwxrwx---. 1 seth users 455 Mar 2 2017 estimate.sh
-rwxrwxr-x. 1 seth users 662 Apr 29 22:27 factorial
-rwxrwx---. 1 seth users 20697793 Jun 29 2018 fop-2.3-bin.tar.gz
-rwxrwxr-x. 1 seth users 6210 May 22 10:22 geteltorito
-rwxrwx---. 1 seth users 177 Nov 12 2018 html4mutt.sh
月份的名字不便於排序,無論是通過計算還是識別(取決於你的大腦是否傾向於喜歡字串或整數)。你可以使用 --time-style
選項和格式名稱更改時間戳的格式。可用格式為:
full-iso
:ISO 完整格式(1970-01-01 21:12:00)long-iso
:ISO 長格式(1970-01-01 21:12)iso
:iso 格式(01-01 21:12)locale
:本地化格式(使用你的區域設定)posix-STYLE
:POSIX 風格(用區域設定定義替換STYLE
)
你還可以使用 date
命令的正式表示法建立自定義樣式。
按時間排序
通常,ls
命令按字母順序排序。你可以使用 -t
選項根據檔案的最近更改的時間(最新的檔案最先列出)進行排序。
例如:
$ touch foo bar baz
$ ls
bar baz foo
$ touch foo
$ ls -t
foo bar baz
列出方式
ls
的標準輸出平衡了可讀性和空間效率,但有時你需要按照特定方式排列的檔案列表。
要以逗號分隔檔案列表,請使用 -m
:
ls -m ~/example
bar, baz, foo
要強制每行一個檔案,請使用 -1
選項(這是數字 1,而不是小寫的 L):
$ ls -1 ~/bin/
bar
baz
foo
要按副檔名而不是檔名對條目進行排序,請使用 -X
(這是大寫 X):
$ ls
bar.xfc baz.txt foo.asc
$ ls -X
foo.asc baz.txt bar.xfc
隱藏雜項
在某些 ls
列表中有一些你可能不關心的條目。例如,元字元 .
和 ..
分別代表“本目錄”和“父目錄”。如果你熟悉在終端中如何切換目錄,你可能已經知道每個目錄都將自己稱為 .
,並將其父目錄稱為 ..
,因此當你使用 -a
選項顯示隱藏檔案時並不需要它經常提醒你。
要顯示幾乎所有隱藏檔案(.
和 ..
除外),請使用 -A
選項:
$ ls -a
.
..
.android
.atom
.bash_aliases
[...]
$ ls -A
.android
.atom
.bash_aliases
[...]
有許多優秀的 Unix 工具有儲存備份檔案的傳統,它們會在儲存檔案的名稱後附加一些特殊字元作為備份檔案。例如,在 Vim 中,備份會以在檔名後附加 ~
字元的檔名儲存。
這些型別的備份檔案已經多次使我免於愚蠢的錯誤,但是經過多年享受它們提供的安全感後,我覺得不需要用視覺證據來證明它們存在。我相信 Linux 應用程式可以生成備份檔案(如果它們聲稱這樣做的話),我很樂意相信它們存在 —— 而不用必須看到它們。
要隱藏備份檔案,請使用 -B
或 --ignore-backups
隱藏常用備份格式(此選項在 BSD 的 ls
中不可用):
$ ls
bar.xfc baz.txt foo.asc~ foo.asc
$ ls -B
bar.xfc baz.txt foo.asc
當然,備份檔案仍然存在;它只是過濾掉了,你不必看到它。
除非另有配置,GNU Emacs 在檔名的開頭和結尾新增雜湊字元(#
)來儲存備份檔案(#file#
)。其他應用程式可能使用不同的樣式。使用什麼模式並不重要,因為你可以使用 --hide
選項建立自己的排除項:
$ ls
bar.xfc baz.txt #foo.asc# foo.asc
$ ls --hide="#*#"
bar.xfc baz.txt foo.asc
遞迴地列出目錄
除非你在指定目錄上執行 ls
,否則子目錄的內容不會與 ls
命令一起列出:
$ ls -F
example/ quux* xyz.txt
$ ls -R
quux xyz.txt
./example:
bar.xfc baz.txt #foo.asc# foo.asc
使用別名使其永久化
ls
命令可能是 shell 會話期間最常使用的命令。這是你的眼睛和耳朵,為你提供上下文資訊和確認命令的結果。雖然有很多選項很有用,但 ls
之美的一部分就是簡潔:兩個字元和Enter鍵,你就知道你到底在哪裡以及附近有什麼。如果你不得不停下思考(更不用說輸入)幾個不同的選項,它會變得不那麼方便,所以通常情況下,即使最有用的選項也不會用了。
解決方案是為你的 ls
命令新增別名,以便在使用它時,你可以獲得最關心的資訊。
要在 Bash shell 中為命令建立別名,請在主目錄中建立名為 .bash_aliases
的檔案(必須在開頭包含 .
)。 在此檔案中,列出要建立的別名,然後是要為其建立別名的命令。例如:
alias ls='ls -A -F -B --human --color'
這一行導致你的 Bash shell 將 ls
命令解釋為 ls -A -F -B --human --color
。
你不必僅限於重新定義現有命令,還可以建立自己的別名:
alias ll='ls -l'
alias la='ls -A'
alias lh='ls -h'
要使別名起作用,shell 必須知道 .bash_aliases
配置檔案存在。在編輯器中開啟 .bashrc
檔案(如果它不存在則建立它),幷包含以下程式碼塊:
if [ -e $HOME/.bash_aliases ]; then
source $HOME/.bash_aliases
fi
每次載入 .bashrc
(這是一個新的 Bash shell 啟動的時候),Bash 會將 .bash_aliases
載入到你的環境中。你可以關閉並重新啟動 Bash 會話,或者直接強制它執行此操作:
$ source ~/.bashrc
如果你忘了你是否有別名命令,which
命令可以告訴你:
$ which ls
alias ls='ls -A -F -B --human --color'
/usr/bin/ls
如果你將 ls
命令別名為帶有選項的 ls
命令,則可以通過將反斜槓字首到 ls
前來覆蓋你的別名。例如,在示例別名中,使用 -B
選項隱藏備份檔案,這意味著無法使用 ls
命令顯示備份檔案。 可以覆蓋該別名以檢視備份檔案:
$ ls
bar baz foo
$ \ls
bar baz baz~ foo
做一件事,把它做好
ls
命令有很多選項,其中許多是特定用途的或高度依賴於你所使用的終端。在 GNU 系統上檢視 info ls
,或在 GNU 或 BSD 系統上檢視 man ls
以瞭解更多選項。
你可能會覺得奇怪的是,一個以每個工具“做一件事,把它做好”的前提而聞名的系統會讓其最常見的命令揹負 50 個選項。但是 ls
只做一件事:它列出檔案,而這 50 個選項允許你控制接收列表的方式,ls
的這項工作做得非常、非常好。
via: https://opensource.com/article/19/7/master-ls-command
作者:Seth Kenlon 選題:lujun9972 譯者:wxy 校對:wxy
相關文章
- Linux ls命令Linux
- linux ls 命令Linux
- Linux 命令“ls ” 的用法Linux
- Linux 命令 ls命令系列(精華)Linux
- Linux基礎命令---lsLinux
- Linux ls命令詳解Linux
- Linux 常用基本命令 -lsLinux
- linux ls命令常用用法Linux
- 模擬linux下的ls -l命令Linux
- 精通 Linux 的 “kill” 命令Linux
- ls 命令
- ls命令
- 每天一個linux命令(1):ls命令Linux
- 每天一個 Linux 命令(1):ls 命令Linux
- Linux常用基本命令( ls, alias)Linux
- Linux ls命令引數詳解Linux
- Linux中的15個基本‘ls’命令示例Linux
- Linux下 ls 命令的高階用法8例Linux
- 10 個 Linux ls 命令的面試問題(二)Linux面試
- 15 個 Linux ls 命令的面試問題(一)Linux面試
- 在Linux中,ls命令有哪些常用的選項?Linux
- Linux ls命令最詳細用法介紹Linux
- Exa – 替代ls命令的工具
- ls命令詳解
- Oracle Linux 命令精通指南OracleLinux
- Linux Find 命令精通指南Linux
- 在 Linux 命令列中使用 ls 列出檔案的技巧Linux命令列
- 你應該瞭解的 7個Linux ls 命令技巧Linux
- Linux系統目錄結構和ls命令Linux
- Linux常用命令之ls、cd、pwd、mkdir命令講解Linux
- Linux系統程式設計【3.2】——ls命令優化版和ls -l實現Linux程式設計優化
- Linux 系統命令精通指南Linux
- Linux 檔案命令精通指南Linux
- 5分鐘學會使用Linux的 grep、find、ls、wc 命令Linux
- Linux系統程式設計【3.1】——編寫ls命令Linux程式設計
- linux下使用ls命令時遇到的一個怪異現象Linux
- ls命令 & 檔案屬性
- Linux 檔案命令精通指南(zt)Linux