¿Cómo hago eco de solo 1 columna de salida del comando ls?


55

Digamos que cuando hago el comando ls la salida es:

file1 file2 file3 file4

¿Es posible mostrar solo una determinada columna de salida, en este caso file2? He intentado lo siguiente sin éxito:

echo ls | $2

Básicamente, todo lo que quiero hacer es repetir solo la segunda columna, en este caso, quiero repetir:

file2

2
¿Cuál es una situación en la que realmente quieres una columna de lssalida?
michas

11
Como regla general, nunca debe analizar ls . Casi siempre hay mejores formas de obtener la información que necesita.
terdon

No haría eso extraño: P (lo siento, siempre me gustó esa frase) el número de columnas depende de los nombres que tienen los archivos y las carpetas, por lo que la segunda columna puede ser la que desea, o no, o puede estar en una lsy después de crear algunos archivos / carpetas, puede que ya no sea lo que desea. Como terdon señaló, seguramente hay mejores maneras de obtener lo que quieres
YoMismo

Respuestas:


83

El siguiente comando formateará la salida ls en una columna

ls -1 /directory

2
Pero no le da solo la única columna en la que está interesado el OP.
Anthon

1
Para corregirlo: ls -1 /directory | head -2 | tail -1ols -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz

@KWubbufetowicz ls | sed -n '1p;q'parece más simple
Fiximan

3
La respuesta que estaba buscando, pero no para la pregunta de OP.
Michael Lang

36

Estás buscando esto:

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

Sin embargo, suponiendo que intente usar este nombre de archivo más tarde, no lo haga, ya que se romperá en los nombres de archivo que contienen espacios en blanco. En su lugar, coloque los archivos en una matriz y obtenga el segundo, lo que evita tener que analizar en absoluto:

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

El orden en que recupera los archivos depende del valor de LC_COLLATE. Como tal, es posible que desee establecer LC_COLLATE=Cprimero, si desea una clasificación "estándar" en todos los casos de esquina.


Tenga en cuenta que los índices de matriz comienzan 1en shells sensibles (zsh, yash, fish, csh, tcsh, rc, es ...) y 0en ksh y bash. Para una solución portátil a todos los shells tipo Bourne, puede usar: en su set -- *; printf '%s\n' "$2"lugar.
Stéphane Chazelas

@ StéphaneChazelas Al menos para esta pregunta, las etiquetas incluyen "bash", por lo que esta respuesta es específica de ese shell.
Chris Down

ls -C | awk '{print $ 1} parece dar el mismo resultado ... ¿por qué $ 2?
Boctulus

7

Debería agregar -Ccomo lsutiliza el modo de columna única cuando la salida no es un terminal. awkluego imprime la segunda columna:

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

2

Creo que estas buscando

ls -1

No mostrará permiso, propietario, grupo, fecha, tamaño ... sino un nombre de archivo simple en una sola columna.


1
Esta respuesta no solo es incorrecta, sino que ya se ha dado antes.
Scott,

Aunque me doy cuenta de que esto está mal para la pregunta original, es lo que estaba buscando. Así que gracias.
AntumDeluge

0

La única forma que funciona para mí es agregar "-todos". Es decir:

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

Porque -allagrega más columnas como usuario, permisos, etc.


0

Como ya se ha mencionado, el uso de columnas para analizar la lssalida no es muy robusto porque lsrompe las líneas de acuerdo con la longitud del nombre del archivo y el ancho del terminal. Sin embargo, a menudo es interesante mostrar una sola columna de una lista de elementos. Puede hacer esto usando el comando de corte:

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

mostrará

file2

Tenga en cuenta que le -dpermite seleccionar el delimitador de columna, por ejemplo, con

cur -d, -f2

puede mostrar la segunda columna de una lista separada por comas.


0

Supongamos que si desea mostrar solo el nombre de archivo particular en la ruta actual, use el siguiente comando

mando:

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

0

Esto es complicado, porque el análisis ls -Cdepende de:

  1. longitud del nombre de archivo (que depende de la lista de archivos especificada que se pasa ls -C)
  2. ancho terminal.
  3. El hecho de que la ls -Csalida es columnar, pero puede estar configurada en un número variable de espacios como separadores de campo.
  4. la posibilidad de espacios en blanco en los nombres de archivo (la visualización de la cual depende de las lsopciones de visualización particulares elegidas).

Por ahora, comencemos con el problema más fácil ( es decir, no el n. ° 4 anterior), suponiendo que no hay espacios en blanco en los nombres de archivo . Para imprimir la columna # 2, esto funciona:

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

Desenrollar eso:

  • COLUMNS=$COLUMNSgarantiza que la longitud de la columna alimentada sea | consistente con la pantalla actual del terminal. Cambiar esto a un valor arbitrario también funciona, por lo que COLUMNS=50o COLUMNS=70 provocaría ls -Creorganizar las cosas de acuerdo con esos anchos.

    Otro método sería usar el -winterruptor, por ejemplo :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • trhace que los separadores de campo sean consistentes: una sola pestaña entre cada columna.

  • cut da salida a la columna deseada.


Método de
espacio

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

cambie la cantidad de caracteres (54) según sea necesario para que solo obtenga los datos que desea.


2
para aclarar, usando 54-tell corta a cada personaje comenzando en la posición 54; no se detiene en la columna "reconocida por el ser humano"
Jeff Schaller

No es una mala idea ... solo necesita ser refinada.
Prusswan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.