為什麼 ls 顯示一個不存在的文件?
我想列出所有名稱以大寫開頭的文件:
[root@localhost /]# ls /usr/bin/[[:upper:]]* /usr/bin/AtoB /usr/bin/GenIssuerAltNameExt /usr/bin/PKCS12Export /usr/bin/AuditVerify /usr/bin/GenSubjectAltNameExt /usr/bin/POST /usr/bin/BtoA /usr/bin/GET /usr/bin/PrettyPrintCert /usr/bin/CMCEnroll /usr/bin/HEAD /usr/bin/PrettyPrintCrl /usr/bin/CMCRequest /usr/bin/HtFileType /usr/bin/RSA_SecurID_getpasswd /usr/bin/CMCResponse /usr/bin/HttpClient /usr/bin/RunSimTest /usr/bin/CMCRevoke /usr/bin/IBMgtSim /usr/bin/TokenInfo /usr/bin/CRMFPopClient /usr/bin/Mail /usr/bin/X /usr/bin/ExtJoiner /usr/bin/OCSPClient /usr/bin/Xorg /usr/bin/GenExtKeyUsage /usr/bin/PKCS10Client
它工作正常,但是當應用目前文件夾時,它看起來很奇怪:
[root@localhost /]# ls ./[[:upper:]]* snk321cq [root@localhost /]# ls -lt snk321cq ls: cannot access snk321cq: No such file or directory [root@localhost /]# ls -lt ./snk321cq ls: cannot access ./snk321cq: No such file or directory
為什麼要顯示
snk321cq
?實際上沒有這樣的文件。
該文件位於與模式匹配的目錄下,使用:
ls -d ./[[:upper:]]*
預設情況下,當將目錄名稱作為參數傳遞時,
ls
顯示其內容,而不是名稱。該-d
選項是禁用此功能。使用該
[[:upper:]]*
模式時,shell 將其擴展為以大寫字母開頭的每個文件名,因此ls
接收擴展的目錄名稱。
如果您只需要列出沒有內容的文件/目錄,最好使用
find /usr/bin/ -maxdepth 1 -name "[[:upper:]]*"
find
無論如何比ls
查找文件/目錄更好用
/usr/bin/Xvfb /usr/bin/Mail /usr/bin/GET /usr/bin/POST /usr/bin/HEAD /usr/bin/Test
這樣您就可以顯示查找結果的 ls 輸出:
find /usr/bin/ -maxdepth 1 -name [[:upper:]]* -ls 272304 1956 -rwxr-xr-x 1 root root 1999608 Oct 18 07:48 /usr/bin/Xvfb 269561 0 lrwxrwxrwx 1 root root 15 Nov 4 2011 /usr/bin/Mail -> ../../bin/mailx 283683 16 -rwxr-xr-x 1 root root 14519 Aug 19 2010 /usr/bin/GET 283685 16 -rwxr-xr-x 1 root root 14519 Aug 19 2010 /usr/bin/POST 283684 16 -rwxr-xr-x 1 root root 14519 Aug 19 2010 /usr/bin/HEAD 21421 4 drwxr-xr-x 2 root root 4096 Jan 13 08:17 /usr/bin/Test