Como eco apenas uma coluna de saída do comando ls?


54

Digamos que quando eu comando ls, a saída é:

file1 file2 file3 file4

É possível exibir apenas uma certa coluna de saída, neste caso, arquivo2? Eu tentei o seguinte sem sucesso:

echo ls | $2

Basicamente, tudo que eu quero fazer é repetir apenas a segunda coluna, neste caso, eu quero repetir:

file2

2
Qual é a situação em que você realmente deseja uma coluna de lssaída?
Michas

11
Como regra geral, você nunca deve analisar ls . Quase sempre existem maneiras melhores de obter as informações necessárias.
terdon

Eu não faria isso de estranho: P (desculpe, eu sempre gostei dessa frase) o número de colunas depende dos nomes dos arquivos e pastas; portanto, a segunda coluna pode ser a que você deseja, ou não, ou pode estar em uma lse depois de criar alguns arquivos / pastas, pode não ser mais o que você deseja. Como terdon apontou aí com certeza são melhores maneiras de obter o que você quer
yomismo

Respostas:


82

O comando a seguir formatará a saída ls em uma coluna

ls -1 /directory

2
Mas não fornece apenas a coluna em que o OP está interessado.
Anthon

11
Para corrigi-lo: ls -1 /directory | head -2 | tail -1ouls -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz 10/02

@KWubbufetowicz ls | sed -n '1p;q'parece mais simples
Fiximan

3
A resposta que eu estava procurando, mas não para a pergunta do OP.
Michael Lang

36

Você está procurando por isso:

ls -C | awk '{ print $2 }'

No entanto, supondo que você tente usar esse nome de arquivo posteriormente, não faça isso, pois ele quebrará os nomes de arquivos que contêm espaço em branco. Em vez disso, coloque os arquivos em uma matriz e obtenha a segunda, que evita a necessidade de fazer qualquer análise:

files=(*)
printf '%s\n' "${files[1]}"

A ordem em que você recupera os arquivos depende do valor de LC_COLLATE. Como tal, convém definir LC_COLLATE=Cprimeiro, se quiser uma classificação "padrão" em todos os casos de canto.


Observe que os índices da matriz começam 1em conchas sensíveis (zsh, yash, fish, csh, tcsh, rc, es ...) e 0em ksh e bash. Para uma solução portátil para todas as conchas do tipo Bourne, você pode usar: em set -- *; printf '%s\n' "$2"vez disso.
Stéphane Chazelas 22/02

@ StéphaneChazelas Pelo menos para esta pergunta, as tags incluem "bash", então essa resposta é específica para esse shell.
22416 Chris Down

ls -C | awk '{print $ 1} parece dar a mesma saída ... por que $ 2?
boctulus 17/01

7

Você precisaria adicionar -Ccomo lsusa o modo de coluna única quando a saída não for um terminal. awkdepois imprime a segunda coluna:

ls -C | awk '{print $2}'

2

Eu acho que você está procurando

ls -1

Não mostrará permissão, proprietário, grupo, data, tamanho ... mas um simples nome de arquivo em uma única coluna.


11
Essa resposta não apenas está errada, mas já foi dada antes.
Scott

Embora eu perceba que isso está errado para a pergunta original, é o que eu estava procurando. Então obrigado.
AntumDeluge 10/10

0

A única maneira de trabalhar para mim é adicionar "-all". Isso é:

ls -C -all | awk '{ print $1 }'

Porque -alladicione mais colunas como usuário, permissões etc.


0

Como já foi mencionado - o uso de colunas para analisar a lssaída não é muito robusto, porque lsquebra as linhas de acordo com o comprimento do nome do arquivo e a largura do terminal. Muitas vezes, é interessante exibir uma única coluna de uma lista de elementos. Você pode fazer isso usando o comando cut:

echo file1 file2 file3 file4 | cut -d" "  -f2

Exibirá

file2

Observe que -dpermite selecionar o delimitador de coluna, por exemplo, com

cur -d, -f2

você pode exibir a segunda coluna de uma lista separada por vírgula.


0

Suponha que, se você deseja exibir apenas o nome de arquivo específico no caminho atual, use o comando abaixo

comando:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"

0

Isso é complicado, porque a análise ls -Cdepende de:

  1. comprimento do nome do arquivo (que depende da lista de arquivos especificada passada para ls -C)
  2. largura do terminal.
  3. o fato de que a ls -Csaída é colunar, mas pode ser configurada para vários números de espaços como separadores de campo.
  4. a possibilidade de espaço em branco nos nomes de arquivos (cuja exibição depende das lsopções de exibição específicas escolhidas).

Por enquanto, vamos começar com o problema mais fácil ( ou seja, não o nº 4 acima), supondo que não haja espaço em branco nos nomes de arquivos . Para imprimir a coluna 2, isso funciona:

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

Desenrolando isso:

  • COLUMNS=$COLUMNSgarante que o comprimento da coluna alimentado | permaneça consistente com a exibição atual do terminal. Alterar isso para um valor arbitrário também funciona, portanto COLUMNS=50ou COLUMNS=70 causaria ls -Cuma reorganização das coisas de acordo com essas larguras.

    Outro método seria usar o -wswitch, por exemplo :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • trtorna os separadores de campos consistentes: uma única guia entre cada coluna.

  • cut produz a coluna desejada.


Método de espaço em branco pendente ...
agc 15/06

-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

altere o número de caracteres (54) conforme necessário para obter apenas os dados desejados.


2
para esclarecer, usando 54-tell cut para todos os caracteres começando na posição 54; ele não para na coluna "reconhecida pelo homem"
Jeff Schaller

Não é uma má idéia ... só precisa ser refinado.
prusswan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.