Comando para listar o conteúdo do diretório, ou fazer o conteúdo de saída se o arquivo?

2

Existe algum comando para listar o conteúdo se passar por um diretório, mas gerar o conteúdo se for um arquivo?

Por exemplo, muitas vezes, quando estou navegando na estrutura de diretórios, vou começar a digitar no terminal algo como

ll /etc/path/  # I see a file in tab-completion that interests me, called myfile.txt
ll /etc/path/myfile.txt  # I do the auto-completion to get it into the command line
less /etc/path/myfile.txt  # Now I have to go back and change 'll' to 'less'

Como alternativa, se estou procurando um arquivo, começo com

less /etc/path  # I see in tab-completion several files that might interest me, so I need to know more
ll /etc/path  # See more info about file sizes, etc, so I can choose the file I want. Have to change 'less' to 'll'
less /etc/path/myfile.txt  # Now that I know which file I want, I have to go back and change 'll' to 'less'

Isso é algo que eu acabo fazendo dezenas de vezes por dia e começa a me atrasar. Existe um comando ou script que faz o cenário mais provável para você? Por exemplo

some-program /etc/path/to/file/or/directory

Se o destino for um arquivo de texto ou um link simbólico para um arquivo de texto, 'less / etc / path / to / .....' será executado. Mas se fosse qualquer outra coisa, por exemplo diretório, arquivo binário, dispositivo de bloco, ele faria 'll / etc / path / to /......'

Claro que se ele fizer algo que você não quer, como 'less' em um link simbólico de arquivo, mas você quer ver o próprio link simbólico com 'll', você simplesmente executa 'll' manualmente.

Qualquer coisa assim existe (aposto que está lá fora, parece uma tarefa tão comum)? Ou eu estou apenas usando a linha de comando do Linux de uma maneira ineficiente e há maneiras melhores de navegar através dela ... como você faz isso? Ou eu sou realmente o único indo e voltando na linha de comando o tempo todo mudando 'menos' para 'll' e vice-versa?

Eu tentei escrever algo, mas sou um novato básico, então definitivamente não está funcionando, e bem desajeitado, mesmo que fosse. Certamente há uma maneira melhor lá fora, algum comando mágico que eu não ouvi falar?

some-program() {
  if [[ $# > 1 ]]; then
    echo "Only one argument supported at this time"
  exit 1
  fi
  if [[ $# == 0 ]]; then
    ELEMENT="."
  else
    ELEMENT="$1"
  fi
  if [[ -d $ELEMENT ]]; then
    ls --color=auto -alF "$ELEMENT"
  else
    less "$ELEMENT"
  fi
}
    
por user779159 17.03.2013 / 12:35

1 resposta

2

less tem um recurso interno realmente interessante que permite fazer coisas como esta. Veja a página lesspipe man.

Para usar esse recurso para mostrar automaticamente uma listagem de diretórios de diretórios, faça o seguinte:

  1. Configure lesspipe seguindo a página do manual: eval "$(lesspipe)"

  2. Crie ~/.lessfilter com o seguinte conteúdo e torne-o executável:

    #!/bin/sh
    if [ -d "$1" ]; then
        ls -alF "$1"
    else
        # We don't handle this format.
        exit 1
    fi
    exit 0
    

Isso configura um script de filtro executado por lesspipe para manipular os tipos de arquivo. Ele verifica se o que você está tentando visualizar é um diretório e, em caso afirmativo, executa ls .

Seu pedido original incluiu cor. Infelizmente, isso é um pouco mais difícil, já que less não exibe cor por padrão e a saída do script de filtro ainda é canalizada por less . Você precisaria usar -R como uma opção padrão (o que provavelmente não é uma boa idéia se você já visualizou um arquivo binário) para fazer isso. Eu não acho que haja uma maneira de o script lessfilter informar less para adicionar uma nova opção.

    
por 18.03.2013 / 06:57