Eu tenho um diretório ~/test
com dois diretórios vazios: emptydir
e emptydir2
.
ls ~/test/*(/)
mostra os dois:
~/test/emptydir:
~/test/emptydir2:
Mas se houver apenas um diretório vazio, ls ~/test/*(/)
não mostra nada. Por que é assim?
Eu tenho um diretório ~/test
com dois diretórios vazios: emptydir
e emptydir2
.
ls ~/test/*(/)
mostra os dois:
~/test/emptydir:
~/test/emptydir2:
Mas se houver apenas um diretório vazio, ls ~/test/*(/)
não mostra nada. Por que é assim?
O
ls
utilitário é necessário para imprimir os nomes dos diretórios cujo conteúdo ele lista quando recebe mais de um diretório para processar em sua linha de comando. Isso ocorre independentemente de esses diretórios estarem vazios ou não.O seguinte é da especificação POSIX do
ls
utilitário :Se você deseja listar os diretórios em si, não seu conteúdo, use
ls
essa-d
opção.Para complementar a resposta de @Kusalananda , observe que
ls
não é o único comando que ignora a impressão de um cabeçalho quando solicitado a processar apenas um argumento.In
ls dir
ouls
que é a abreviação dels .
, já que foi passado apenas um argumento,ls
pressupõe que você saiba de qual diretório está obtendo a listagem, já que acabou de solicitá-la. Isso desmorona aqui quando a lista de diretórios é o resultado de uma expansão (aqui geração de nome de arquivo , também conhecida como expansão de nome de caminho ) que resulta em uma e apenas uma entrada.É o mesmo para
grep -- pattern *.txt
ondegrep
não mostrará o nome do arquivo quando*.txt
expandido para um e apenas um arquivo, ouhead -- *.txt
(observe que passar mais de um arquivo parahead
não é padrão).A implementação GNU de alguns desses utilitários tem opções para forçar a impressão do cabeçalho mesmo que seja passado apenas um argumento como
-H
/--with-filename
para GNUgrep
ou-v
/--verbose
para GNUhead
/tail
, mas esse não é o caso do GNUls
.No entanto, uma abordagem portátil que funciona para muitos comandos é passar um argumento extra para o comando além do resultado da expansão, de modo a garantir que pelo menos 2 argumentos sejam passados e pós-processar a saída para remover a saída correspondente, se necessário .
Por exemplo, GNUs
grep -H -- pattern *.txt
podem ser escritos de forma portávelgrep -- pattern /dev/null *.txt
(não há necessidade de pós-processar a saída, pois/dev/null
está vazia, portanto não haverá correspondência).Para
ls
, você pode usarls -- /dev/null *(/) | tail -n +3
, aqui usandotail -n +3
para remover a listagem por/dev/null
si só, que deve vir primeiro, pois o POSIX exige que a saída para operandos que não sejam de diretório seja listada primeiro.