Você pode usar find , que (em muitas plataformas) possui uma opção -ls . Então você poderia fazer
find . -maxdepth 1 -name '*' -ls
Mas, se for difícil lembrar de ls -d , talvez você não encontre find de melhoria.
Acabei de aprender que o ls não pode manipular curingas ( ls '*' não funciona) e, portanto, o shell faz isso antes que o ls seja invocado.
Então o comportamento de ls pode ser considerado logicamente para pessoas que trabalham 20 anos com unix, para mim não é e eu não mantenho com ls.
Eu quero um comando de diretório que procure por arquivos e diretórios e depois aplique o filtro curinga. Então, um ls cr* não lista arquivos dentro do diretório "cron.daily".
Eu sei que existe ls -d e fiz um alias lx=ls -lartd .
Mas então eu reconheci que ls -d sem qualquer argumento por alguma razão secreta não funciona de forma alguma.
Existe algum substituto que eu possa instalar?
Você pode usar find , que (em muitas plataformas) possui uma opção -ls . Então você poderia fazer
find . -maxdepth 1 -name '*' -ls
Mas, se for difícil lembrar de ls -d , talvez você não encontre find de melhoria.
Se o que você deseja é um comando cmd , de modo que cmd cr* liste cron.daily em si, esse comando será ls -d . Se houver muita digitação, você pode definir um alias . Por exemplo, coloque esta linha no seu ~/.bashrc :
alias l='ls -d'
Em seguida, executar l cr* exibirá informações sobre cron.daily , enquanto ls cr* listará o conteúdo do diretório cron.daily (e de qualquer outro diretório que corresponda ao padrão e a qualquer outro diretório que não corresponda ao padrão) .
ls -d funciona. Ele faz exatamente o que você pediu: ele lista o diretório atual. Isso pode não ser muito útil - ls -ld é um pouco útil, mas não ls -d - mas os computadores fazem o que você manda, eles não lêem a sua opinião para descobrir o que você quer.
Se o que você quer é obter o efeito de ls -d , exceto que sem argumentos você recebe uma listagem do diretório atual, você pode definir uma função.
l () {
if [ $# -eq 0 ]; then
ls -l
else
ls -ld "$@"
fi
}
Em seguida, l cr* lista os arquivos cujo nome começa com cr , mesmo que sejam diretórios. E l cron.daily listas cron.daily em si, não seu conteúdo; você pode usar ls cron.daily ou l cron.daily/* para listar o conteúdo. Mas l lista os arquivos no diretório atual.
Com a função acima, l -a passará o sinal -d . Se você não quiser isso, você pode fazer as opções de descarte da função ao determinar se ele possui argumentos de nome de arquivo.
l () {
local a
a=("$@")
while [[ $1 = -* ]]; do shift; done
if [ $# -eq 0 ]; then
ls -l "${a[@]}"
else
ls -ld "${a[@]}"
fi
}
Se o que você deseja é um comando cmd , para que cmd cron.daily liste os arquivos no subdiretório cron.daily , mas cmd cd* listas cron.daily em si, isso é impossível no bash. No momento em que o comando é executado, o shell expandiu os curingas e o comando não pode saber se você usou curingas ou não.
Isso é possível em zsh , porque em zsh você pode desabilitar a expansão de curingas para um comando específico. Zsh não é o shell padrão na maioria dos sistemas, mas é apenas uma instalação de pacote de distância. Em zsh, você pode definir um alias com o noglob prefix :
alias l='noglob list_files_or_directory_contents'
Você precisará definir essa função list_files_or_directory_content - sua necessidade é incomum, então provavelmente ela ainda não existe. Aqui está uma função que eu acho que faz o que você está procurando: listar o conteúdo dos diretórios especificados diretamente e listar os próprios diretórios se eles vierem de uma expansão curinga.
list_files_or_directory_contents () {
local arg matches
setopt local_options no_csh_null_glob no_null_glob no_nomatch no_glob_subst no_sh_word_split
if (($#==0)); then
# No arguments: list the directory itself
ls -l
else
for arg; do
matches=($~arg)
if [[ $#matches -eq 1 && $matches[1] == $arg ]]; then
# Not a wildcard pattern: list the directory contents if it's a directory
ls -l -- $arg
else
# Wildcard pattern: list the matches themselves, even the ones that are directories
ls -ld -- $matches
fi
done
fi
}
Acho que isso vai fazer o que você quiser. A abordagem poderia, suponho, ser aplicada a tantas utilidades quantas quisesse. Mas eu realmente não recomendaria isso porque vai quebrar seus "hábitos dos dedos" quando você for para um novo sistema que ainda não tenha mexido.
ls() { [[ 0 == $# ]] && set -- *; /bin/ls -d "$@"; }
Por extensão, seu alias seria substituído por essa função:
lx() { [[ 0 == $# ]] && set -- *; /bin/ls -lartd "$@"; }
Aqui está uma função de shell que faz o que você quer. Você pode colá-lo diretamente no seu terminal ou adicioná-lo ao arquivo de inicialização do seu shell (por exemplo, ~/.bashrc for bash):
function dir {
if [ -n "$1" ]
then
ls -lartd "$@"
else
ls -lartd *
fi
}