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
John
fonte
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
ch0ps
fonte
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.

Chris Down
fonte
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}'
tkrennwa
fonte
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.

Niti
fonte
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.

Diego Andrés Díaz Espinoza
fonte
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.

A Roebel
fonte
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"
Praveen Kumar BS
fonte
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.

agc
fonte
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.

m.rumore
fonte
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