天天看點

Linux基礎之ls與檔案名通配詳解

引言    ls應該是我們最熟悉的指令之一,通常進入指令行,少不了就要ls一下。

雖然它是一個很基本很常用的指令,不過它的功能也很豐富,熟練使用它可以更加便捷我們看我們想要看到的檔案資訊。

                                                                實驗環境CentOS7.2

ls指令介紹

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

<code>[root@localhost ~]</code><code># man ls</code>

<code>LS(1)                            User Commands                           LS(1)</code>

<code>NAME</code>

<code>       </code><code>ls</code> <code>- list directory contents</code>

<code>SYNOPSIS</code>

<code>       </code><code>ls</code> <code>[OPTION]... [FILE]...</code>

<code>DESCRIPTION</code>

<code>       </code><code>List  information  about  the FILEs (the current directory by default).</code>

<code>       </code><code>Sort entries alphabetically </code><code>if</code> <code>none of -cftuvSUX nor --</code><code>sort</code>  <code>is  speci‐</code>

<code>       </code><code>fied.</code>

<code>       </code><code>Mandatory  arguments  to  long  options are mandatory </code><code>for</code> <code>short options</code>

<code>       </code><code>too.</code>

<code>       </code><code>-a, --all</code>

<code>              </code><code>do</code> <code>not ignore entries starting with .</code>

<code>       </code><code>-A, --almost-all</code>

<code>              </code><code>do</code> <code>not list implied . and ..</code>

<code>       </code><code>-d, --directory</code>

<code>              </code><code>list directories themselves, not their contents</code>

<code>       </code><code>-h, --human-readable</code>

<code>              </code><code>with -l, print sizes </code><code>in</code> <code>human readable </code><code>format</code> <code>(e.g., 1K 234M 2G)</code>

<code>       </code><code>-i, --inode</code>

<code>              </code><code>print the index number of each </code><code>file</code>

<code>       </code><code>-l     use a long listing </code><code>format</code>

<code>       </code><code>-r, --reverse</code>

<code>              </code><code>reverse order </code><code>while</code> <code>sorting</code>

<code>       </code><code>-R, --recursive</code>

<code>              </code><code>list subdirectories recursively</code>

<code>       </code><code>-S     </code><code>sort</code> <code>by </code><code>file</code> <code>size</code>

<code>       </code><code>-t     </code><code>sort</code> <code>by modification </code><code>time</code><code>, newest first</code>

<code>       </code><code>-u     with  -lt:  </code><code>sort</code> <code>by, and show, access </code><code>time</code><code>; with -l: show access</code>

<code>              </code><code>time</code> <code>and </code><code>sort</code> <code>by name; otherwise: </code><code>sort</code> <code>by access </code><code>time</code>

以上的内容有所省略,本文隻截取常用到的11個選項做詳細說明。

    -a 顯示所有内容,包括以.開頭的隐藏檔案

<code>[root@localhost ~]</code><code># ls -a /root</code>

<code>.                .bash_logout   .config  .esd_auth             .</code><code>local</code>       <code>公共  文檔</code>

<code>..               .bash_profile  .cshrc   .ICEauthority         .mozilla     模闆  下載下傳</code>

<code>anaconda-ks.cfg  .bashrc        CST      initial-setup-ks.cfg  .tcshrc      視訊  音樂</code>

<code>.bash_history    .cache         .dbus    .lesshst              .Xauthority  圖檔  桌面</code>

    -A 顯示所有内容,但不包括.和..檔案,顯示以.開頭的隐藏檔案

<code>[root@localhost ~]</code><code># ls -A /root/</code>

<code>anaconda-ks.cfg  .bashrc  CST            initial-setup-ks.cfg  .tcshrc      視訊  音樂</code>

<code>.bash_history    .cache   .dbus          .lesshst              .Xauthority  圖檔  桌面</code>

<code>.bash_logout     .config  .esd_auth      .</code><code>local</code>                <code>公共         文檔</code>

<code>.bash_profile    .cshrc   .ICEauthority  .mozilla              模闆         下載下傳</code>

    -d 顯示目錄本身但不顯示目錄下的内容

<code>[root@localhost ~]</code><code># ls -d /root</code>

<code>/root</code>

<code>[root@localhost ~]</code><code># ls /root</code>

<code>anaconda-ks.cfg  CST  initial-setup-ks.cfg  公共  模闆  視訊  圖檔  文檔  下載下傳  音樂  桌面</code>

    -h 以人易識别的方式展示檔案大小必須與-l一起使用

    -l 檔案長格式,也就是展示檔案詳細資訊

<code>[root@localhost ~]</code><code># ls -l /root</code>

<code>總用量 8</code>

<code>-rw-------. 1 root root 1172 7月  20 00:38 anaconda-ks.cfg</code>

<code>drwxr-xr-x. 2 root root    6 7月  21 18:52 CST</code>

<code>-rw-------. 1 root root 1220 7月  19 16:46 initial-setup-ks.cfg</code>

<code>drwxr-xr-x. 2 root root    6 7月  22 09:52 公共</code>

<code>drwxr-xr-x. 2 root root    6 7月  22 09:52 模闆</code>

<code>drwxr-xr-x. 2 root root    6 7月  22 09:52 視訊</code>

<code>drwxr-xr-x. 2 root root    6 7月  22 09:52 圖檔</code>

<code>drwxr-xr-x. 2 root root    6 7月  22 09:52 文檔</code>

<code>drwxr-xr-x. 2 root root    6 7月  22 09:52 下載下傳</code>

<code>drwxr-xr-x. 2 root root    6 7月  22 09:52 音樂</code>

<code>drwxr-xr-x. 2 root root    6 7月  22 09:52 桌面</code>

上面顯示了加-l與不加-l的卻别,下面看看加-h的好處

<code>[root@localhost ~]</code><code># ls -lh /root</code>

<code>總用量 8.0K</code>

<code>-rw-------. 1 root root 1.2K 7月  20 00:38 anaconda-ks.cfg</code>

<code>-rw-------. 1 root root 1.2K 7月  19 16:46 initial-setup-ks.cfg</code>

之前的位元組都自動轉換為kb格式,上面的更友善與我們對于檔案大小有更直覺的認識。

    -i 顯示檔案inode号,關于inode我還有一些困惑,等了解足夠清楚在後面會專門為inode寫一篇文字。

<code>[root@localhost ~]</code><code># ls -il /root</code>

<code> </code><code>72664101 -rw-------. 1 root root 1172 7月  20 00:38 anaconda-ks.cfg</code>

<code> </code><code>73207816 drwxr-xr-x. 2 root root    6 7月  21 18:52 CST</code>

<code> </code><code>72699695 -rw-------. 1 root root 1220 7月  19 16:46 initial-setup-ks.cfg</code>

<code>  </code><code>2536844 drwxr-xr-x. 2 root root    6 7月  22 09:52 公共</code>

<code>101603105 drwxr-xr-x. 2 root root    6 7月  22 09:52 模闆</code>

<code>  </code><code>2536850 drwxr-xr-x. 2 root root    6 7月  22 09:52 視訊</code>

<code>101603106 drwxr-xr-x. 2 root root    6 7月  22 09:52 圖檔</code>

<code> </code><code>35973547 drwxr-xr-x. 2 root root    6 7月  22 09:52 文檔</code>

<code> </code><code>73207845 drwxr-xr-x. 2 root root    6 7月  22 09:52 下載下傳</code>

<code> </code><code>73207846 drwxr-xr-x. 2 root root    6 7月  22 09:52 音樂</code>

<code> </code><code>34020951 drwxr-xr-x. 2 root root    6 7月  22 09:52 桌面</code>

現在可以簡單的認為inode相當于大公司的員工号,大公司根據員工号精确定位某個人,而它則是準确定位檔案存儲的位置。

    -r 逆序顯示檔案

<code>[root@localhost ~]</code><code># ls -rl /root </code>

    -R 遞歸顯示目錄内容

37

38

39

40

41

<code>[root@localhost ~]</code><code># ls -Rl /root </code>

<code>/root</code><code>:</code>

<code>/root/CST</code><code>:</code>

<code>總用量 0</code>

<code>/root/</code><code>公共:</code>

<code>/root/</code><code>模闆:</code>

<code>/root/</code><code>視訊:</code>

<code>/root/</code><code>圖檔:</code>

<code>/root/</code><code>文檔:</code>

<code>/root/</code><code>下載下傳:</code>

<code>/root/</code><code>音樂:</code>

<code>/root/</code><code>桌面:</code>

加上遞歸後會在顯示主目錄下的内容後在分别顯示各個子目錄下的所有内容,如果子目錄下還有子目錄也依次展開。其目的與-d相反

    -S 按檔案大小排序

<code>[root@localhost ~]</code><code># ls -Sl /root </code>

    -t 以mtime時間前後排序,mtime越新越靠前

<code>[root@localhost ~]</code><code># ls -tl /root</code>

    -u 必須與-t合用,表示以atime時間前後排序,atime越新越靠前

<code>[root@localhost ~]</code><code># ls -tul /root</code>

<code>drwxr-xr-x. 2 root root    6 7月  31 09:39 視訊</code>

<code>drwxr-xr-x. 2 root root    6 7月  31 09:39 圖檔</code>

<code>drwxr-xr-x. 2 root root    6 7月  31 09:39 音樂</code>

<code>drwxr-xr-x. 2 root root    6 7月  31 09:39 下載下傳</code>

<code>drwxr-xr-x. 2 root root    6 7月  31 09:39 文檔</code>

<code>drwxr-xr-x. 2 root root    6 7月  31 09:39 公共</code>

<code>drwxr-xr-x. 2 root root    6 7月  31 09:39 CST</code>

<code>drwxr-xr-x. 2 root root    6 7月  31 09:39 桌面</code>

<code>drwxr-xr-x. 2 root root    6 7月  31 09:39 模闆</code>

<code>-rw-------. 1 root root 1172 7月  19 16:46 anaconda-ks.cfg</code>

檔案名通配

下面簡要介紹下,檔案名的通配符

*比對零個或多個字元               ?比對任何單個字元             

~ 目前使用者家目錄                  ~username 使用者家目錄

~-前一個工作目錄                  ~+ 目前工作目錄

[0-9]比對一個數字範圍             [a-z]:大寫和小寫字母

[A-Z]:大寫和小寫字母

[]比對清單中的任何的一個字元      [^]比對清單中的所有字元以外的字元

[:digit:]:任意數字,相當于0-9    [:lower:]:任意小寫字母

[:upper:]: 任意大寫字母           [:alpha:]: 任意大小寫字母 

[:alnum:]:任意數字或字母         [:space:]:空格

[:punct:]:标點符号

下面通過一些實際例子,感受下檔案名通配給我們帶來的一些好處。

1、顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現至少一位數字的檔案或目錄

<code>[root@localhost ~]</code><code># ls /var/l*[0-9]*[[:lower:]]</code>

<code>ls</code><code>: 無法通路</code><code>/var/l</code><code>*[0-9]*[[:lower:]]: 沒有那個檔案或目錄</code>

找不到,那我們自己建立一個符合條件的檔案

<code>[root@localhost ~]</code><code># touch /var/lq2e            </code>

<code>[root@localhost ~]</code><code># ls -l /var/l*[0-9]*[[:lower:]]</code>

<code>-rw-r--r--. 1 root root 0 7月  31 14:17 </code><code>/var/lq2e</code>

成功找到

2、顯示/etc目錄下以任意一位數字開頭,且以非數字結尾的檔案或目錄

<code>[root@localhost ~]</code><code># ls /etc/[0-9]*[^0-9]</code>

<code>ls</code><code>: 無法通路</code><code>/etc/</code><code>[0-9]*[^0-9]: 沒有那個檔案或目錄</code>

<code>[root@localhost ~]</code><code># touch /etc/3q</code>

<code>/etc/3q</code>

初始的/etc/下沒有符合條件的,通過建立一個符合條件的檔案,成功檢索并顯示出來

3、顯示/etc/目錄下以非字母開頭,後面跟了一個字母及其它任意長度任意字元的檔案或目錄

<code>[root@localhost ~]</code><code># ls /etc/[^[:alpha:]][[:alpha:]]*</code>

成功顯示

4、顯示/etc目錄下所有以m開頭以非數字結尾的檔案或目錄

<code>[root@localhost ~]</code><code># ls /etc/m*[^0-9]</code>

<code>/etc/machine-id</code>  <code>/etc/makedumpfile</code><code>.conf.sample  </code><code>/etc/motd</code>         <code>/etc/my</code><code>.cnf</code>

<code>/etc/magic</code>       <code>/etc/man_db</code><code>.conf               </code><code>/etc/mtab</code>

<code>/etc/mail</code><code>.rc     </code><code>/etc/mke2fs</code><code>.conf               </code><code>/etc/mtools</code><code>.conf</code>

<code>/etc/maven</code><code>:</code>

<code>/etc/modprobe</code><code>.d:</code>

<code>mlx4.conf</code>

<code>/etc/modules-load</code><code>.d:</code>

<code>/etc/multipath</code><code>:</code>

<code>/etc/my</code><code>.cnf.d:</code>

<code>mysql-clients.cnf</code>

5、顯示/etc目錄下,所有以.d結尾的檔案或目錄

<code>[root@localhost ~]</code><code># ls -d /etc/*.d</code>

<code>/etc/bash_completion</code><code>.d  </code><code>/etc/ipsec</code><code>.d         </code><code>/etc/profile</code><code>.d      </code><code>/etc/rwtab</code><code>.d</code>

<code>/etc/binfmt</code><code>.d           </code><code>/etc/ld</code><code>.so.conf.d    </code><code>/etc/rc0</code><code>.d          </code><code>/etc/sane</code><code>.d</code>

<code>/etc/chkconfig</code><code>.d        </code><code>/etc/libibverbs</code><code>.d    </code><code>/etc/rc1</code><code>.d          </code><code>/etc/setuptool</code><code>.d</code>

<code>/etc/cron</code><code>.d             </code><code>/etc/logrotate</code><code>.d     </code><code>/etc/rc2</code><code>.d          </code><code>/etc/statetab</code><code>.d</code>

<code>/etc/depmod</code><code>.d           </code><code>/etc/modprobe</code><code>.d      </code><code>/etc/rc3</code><code>.d          </code><code>/etc/sudoers</code><code>.d</code>

<code>/etc/dnsmasq</code><code>.d          </code><code>/etc/modules-load</code><code>.d  </code><code>/etc/rc4</code><code>.d          </code><code>/etc/sysctl</code><code>.d</code>

<code>/etc/dracut</code><code>.conf.d      </code><code>/etc/my</code><code>.cnf.d        </code><code>/etc/rc5</code><code>.d          </code><code>/etc/tmpfiles</code><code>.d</code>

<code>/etc/exports</code><code>.d          </code><code>/etc/oddjobd</code><code>.conf.d  </code><code>/etc/rc6</code><code>.d          </code><code>/etc/usb_modeswitch</code><code>.d</code>

<code>/etc/gdbinit</code><code>.d          </code><code>/etc/pam</code><code>.d           </code><code>/etc/rc</code><code>.d           </code><code>/etc/xinetd</code><code>.d</code>

<code>/etc/grub</code><code>.d             </code><code>/etc/popt</code><code>.d          </code><code>/etc/request-key</code><code>.d  </code><code>/etc/yum</code><code>.repos.d</code>

<code>/etc/init</code><code>.d             </code><code>/etc/prelink</code><code>.conf.d  </code><code>/etc/rsyslog</code><code>.d</code>

這裡我們得加上-d不顯示目錄内的内容,否則列出來的東西會非常多。因為我們想要的隻是上述結果,是以不相關的内容還是不顯示的好。

6、顯示/etc目錄下,所有.conf結尾,且以m,n,r,p開頭的檔案或目錄

<code>[root@localhost ~]</code><code># ls -d /etc/[mnrp]*.conf</code>

<code>/etc/man_db</code><code>.conf    </code><code>/etc/nsswitch</code><code>.conf  </code><code>/etc/radvd</code><code>.conf        </code><code>/etc/rsyslog</code><code>.conf</code>

<code>/etc/mke2fs</code><code>.conf    </code><code>/etc/numad</code><code>.conf     </code><code>/etc/request-key</code><code>.conf</code>

<code>/etc/mtools</code><code>.conf    </code><code>/etc/pbm2ppa</code><code>.conf   </code><code>/etc/resolv</code><code>.conf</code>

<code>/etc/nfsmount</code><code>.conf  </code><code>/etc/pnm2ppa</code><code>.conf   </code><code>/etc/rsyncd</code><code>.conf</code>

提示:我們在使用檔案通配符查找自己想看到的内容是最好加上-d因為不加的話,你會看到很多非相關資訊。

看到這相信大家對于ls及檔案名通配内容已經有了初步的了解。

在大家看到這時不知有沒有疑惑,在上面的6個例子裡面,顯示字母我用的是[:alpha:]而不是[a-z]、[A-Z]為什麼呢,[a-z]、[A-Z]有什麼差別呢?

下面對這個問題做下說明

我們先建立一個實驗用的目錄及4個檔案

/test1目錄

/test1/a檔案      /test1/A檔案      /test1/Z檔案    /test1/z檔案

<code>[root@localhost ~]</code><code># ls /test1/           </code>

<code>a  A  z  Z</code>

我們先分别ls /test1目錄下的[:alpha:]、[a-z]、[A-Z]看看效果

<code>[root@localhost ~]</code><code># ls /test1/[[:alpha:]]</code>

<code>/test1/a</code>  <code>/test1/A</code>  <code>/test1/z</code>  <code>/test1/Z</code>

<code>[root@localhost ~]</code><code># ls /test1/[a-z]</code>

<code>/test1/a</code>  <code>/test1/A</code>  <code>/test1/z</code>

<code>[root@localhost ~]</code><code># ls /test1/[A-Z]</code>

<code>/test1/A</code>  <code>/test1/z</code>  <code>/test1/Z</code>

我們發現[:alpha:]包含所有大小寫字母,[a-z]則不包含Z,[A-Z]不包含a。雖然[a-z][A-Z]這兩個檔案通配符不區分帶小寫,但是其所表示的範圍還是有細微差别,是以在我們不了解其差别的情況下,穩妥起見還是選擇使用[:alpha:]比較好。

本文轉自 紫色的茶碗 51CTO部落格,原文連結:http://blog.51cto.com/chawan/1832384,如需轉載請自行聯系原作者

繼續閱讀