ls discrepância - encontrado vs não encontrado (nenhum arquivo ou diretório) - no mesmo arquivo [fechado]

0

Curinga uma parte do nome do arquivo, ls diz que existe:

$ ls *rammar*  
London_Grammar_-_Hey_Now_Official_Video-nMEHJPuggHQ.mp4  
London_Grammar_-_Hey_Now_Radio_1_s_Big_Weekend_2014-on1QEcz1sTI.webm  
London_Grammar_-_Interlude_Live_on_KEXP-7eNA90LlxmY.mp4

Curinga outra parte do nome do arquivo, ls diz que não existe:

$ ls *7eNA9*
ls: cannot access '*7eNA9*': No such file or directory

ls não é aliased

Código de retorno (via echo $? ):

2

homem ls:

Exit status:  
 2      if serious trouble (e.g., cannot access command-line argument).

CentOS

7.5.1804

bash

4.2.46(2)

coreutils

GNU v8.22
    
por iletras 19.05.2018 / 21:10

1 resposta

4

Um padrão de globalização de shell se expandirá para qualquer nome que corresponda a ele, independentemente de o nome ser de um arquivo ou diretório comum. Quando ls recebe o nome de um diretório na linha de comando, ele listará seu conteúdo.

Parece que um ou vários dos nomes relatados por ls para ls *rammar* podem vir de um diretório cujo nome corresponda a esse padrão. Um desses arquivos é o último arquivo na saída ls .

É por isso que, quando você tenta o segundo comando, o arquivo não pode ser encontrado. Não está disponível no diretório atual.

Resumo dos principais pontos dos comentários:

Eu sugeri que

find . -type f -name '*7eNA90*'

localizaria o arquivo, e também adicionou que era importante citar o padrão *7eNA90* neste caso para que o shell não tente expandi-lo (ele é usado por find ).

@ higras tentou isso e funcionou, mas ele também descobriu que funcionava sem as aspas. Ele funciona sem as aspas, pois não há nada que corresponda ao padrão no diretório atual, portanto, o shell deixa o padrão não expandido.

No entanto, tornar um hábito depender desse comportamento é perigoso, pois, no caso geral, nem sempre é possível saber ou lembrar quais nomes estão, ou estarão disponíveis no diretório atual. Algumas shells também têm opções de shell para expandir padrões não correspondidos para a cadeia vazia, como a opção nullglob shell em bash . Definir essa opção de shell faria com que o comando falhasse se o padrão estivesse sem aspas.

É mais seguro simplesmente citar o padrão do que confiar nas circunstâncias.

    
por 19.05.2018 / 21:53