Debo repetir solo los nombres de archivos o directorios con esta construcción:
ls -Al | while read string
do
...
done
ls -Al
salida:
drwxr-xr-x 12 s162103 studs 12 march 28 12:49 personal domain
drwxr-xr-x 2 s162103 studs 3 march 28 22:32 public_html
drwxr-xr-x 7 s162103 studs 8 march 28 13:59 WebApplication1
Por ejemplo si lo intento:
ls -Al | while read string
do
echo "$string" | awk '{print $9}
done
luego genera solo archivos y directorios sin espacios. Si el archivo o directorio tiene espacios como "dominio personal", será solo la palabra "personal".
Necesito una solución muy simple. Quizás haya una mejor solución que awk.
linux
command-line
ls
Alex Zern
fuente
fuente
ls -Al *' '*
? Analizarls
la salida nunca conduce a nada bueno.ls -Al | while
. Una forma simple y más confiable esfor string in *; do echo "$string"; done
.ls
? El análisisls
y "funciona en todo * nix y no se romperá si algo sucede" no funcionan bien juntos.Respuestas:
Usted realmente no debe analizar la salida de
ls
. Si esta es una tarea y debe hacerlo, su profesor no sabe de qué están hablando. ¿Por qué no haces algo como esto?El bueno...
o
...el malo...
Si realmente quieres usarlo
ls
, puedes hacerlo un poco más robusto haciendo algo como esto:... y lo feo
Si insiste en hacerlo de la manera incorrecta y peligrosa y solo tiene que usar un
while
bucle, haga lo siguiente:En serio, no lo hagas.
fuente
drwx------ 2 s162103 studs 3 oct. 9 2012 .ssh drwxr-xr-x 3 s162103 studs 6 oct. 25 09:02 .subversion drwxrwxrwt 3 s162103 studs 3 nov. 15 2012 .TempoItems
a veces tengo citas sin tiempo, solo el año y Gawk vuelven vacíasls
.-l
interruptor de todos modos? Si todo lo que quiere son los nombres de los archivos, simplemente ejecutels -A
. Usar-l
solo hace que tu vida sea más difícil ya que ahora tienes que analizar la salida.ls
No es la mejor manera de obtener lo que necesita. ¿Por qué no publica una nueva pregunta explicando la información que desea recopilar y podemos sugerir formas de hacerlo? Alternativamente, puede usar su script tal como está, y usar una de las sugerencias anteriores para imprimir solo el nombre. Pero en serio, no analicesls
, solo dinos exactamente qué estás tratando de hacer en una nueva pregunta.¿Hay alguna razón por la que
ls -A1
* no funcione?P.ej:
* Nota: esa es una letra mayúscula A y la número uno.
fuente
Me pregunto por qué nadie mencionó este simple comando:
fuente
sort
hace que el bloque de varias columnas no se divida en una sola columna?ls
revierte als -1
(salida de una sola columna) cuando su salida no va a una terminal (y deshabilita la cita / reemplazo de caracteres no imprimibles; @Kusalananda,ls
no es compatible con POSIX si todavía lo hace).ls
La salida ya está ordenada. Por lo tanto, canalizarlosort
en el mejor de los casos no hará nada y, en el peor de los casos, alterará la salida (si los nombres de archivo contienen caracteres de nueva línea) o fallará para los nombres de archivo que no son texto.ls -a | cat
seria mejor. O incluso mejorls -A1
como ya se mencionó (y porque generalmente desea los reemplazos / citas cuando se muestran en una terminal)ls
se comporta de manera diferente cuando la salida no es una terminal.No puede analizar la salida de
ls
, y mucho menosls -l
porque la nueva línea, al igual que el espacio es un carácter tan válido como cualquier otro en un nombre de archivo. Además, deberá tener en cuenta los enlaces simbólicos que tienen una salida como... foo -> bar
.¿Por qué usarías de
-l
todos modos si solo quieres el nombre del archivo?Solo haz:
Si desea incluir archivos de puntos (excepto
.
y..
), dependiendo del shell:zsh
:bash
:ksh93
:POSIXY:
fuente
Qué tal si:
fuente
comprima múltiples espacios en espacios individuales con tr, luego puede usar cortar para dividir en los campos
fuente
Pruebe (
bash
,zsh
,ksh93
sintaxis):Ver también:
ls
? en unix SEfuente
prueba
ls -1
Thats Integer 1De la página man.
fuente
muestra qué archivos en qué directorio.
fuente