Por que ls exibe um arquivo não existente?

5

Eu quero listar todos os arquivos cujo nome começa com maiúsculas:

[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

Funciona bem, mas quando aplicada a pasta atual, parece estranho:

[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

Por que exibir snk321cq ? Na verdade, não existe tal arquivo.

    
por Nan Xiao 13.01.2015 / 09:13

2 respostas

15

Este arquivo está sob um diretório correspondente ao padrão, use:

ls -d ./[[:upper:]]*

Por padrão, quando passado um nome de diretório como argumento, ls exibe seu conteúdo, não seu nome. A opção -d está desativando esse recurso.

Ao usar o padrão [[:upper:]]* , o shell está expandindo-o para cada nome de arquivo, começando com uma letra maiúscula, então ls recebe o nome do diretório expandido.

    
por 13.01.2015 / 09:19
0

Se você precisa apenas listar os arquivos / diretórios sem o seu conteúdo, use melhor

find  /usr/bin/ -maxdepth 1 -name "[[:upper:]]*"

De qualquer forma, é melhor usar find do que ls para localizar arquivos / pastas no /usr/bin/Xvfb /usr/bin/Mail /usr/bin/GET /usr/bin/POST /usr/bin/HEAD /usr/bin/Test

e desta forma você pode mostrar a saída ls dos resultados da pesquisa:

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

    
por 13.01.2015 / 14:20