Quiero iterar sobre cada línea en la salida de: ls -l /some/dir/*
Ahora mismo estoy intentando: for x in $(ls -l $1); do echo $x; done
Sin embargo, esto itera sobre cada elemento en la línea por separado, así que obtengo:
-r--r-----
1
ivanevf
eng
1074
Apr
22
13:07
File1
-r--r-----
1
ivanevf
eng
1074
Apr
22
13:17
File2
Pero quiero iterar sobre cada línea como un todo. ¿Cómo puedo hacer eso?
Respuestas:
Establezca IFS en una nueva línea, así:
Coloque un sub-shell a su alrededor si no desea configurar IFS permanentemente:
O utilizar while | leer en su lugar:
Una opción más, que ejecuta while / read en el mismo nivel de shell:
fuente
read -r
o, de lo contrario, bash eliminará las barras invertidas sin escape de los datos.Depende de lo que quieras hacer con cada línea. awk es una utilidad útil para este tipo de procesamiento. Ejemplo:
.. en mi sistema imprime el nombre y tamaño de cada elemento en el directorio.
fuente
Como ya se mencionó, awk es la herramienta adecuada para esto. Si no desea usar awk, en lugar de analizar la salida de "ls -l" línea por línea, puede iterar sobre todos los archivos y hacer un "ls -l" para cada archivo individual como este:
fuente
También puede probar el
find
comando. Si solo desea archivos en el directorio actual:¿Ejecutar un comando en cada uno de ellos?
¿Contar líneas, pero solo en archivos?
fuente
La utilidad read (1) junto con la redirección de salida del comando ls (1) hará lo que desee.
fuente
Entonces, ¿por qué nadie sugirió simplemente usar opciones que eliminen las partes que no quiere procesar?
En Debian moderno, solo obtiene su archivo con:
Además, no tiene que prestar atención al directorio en el que lo está ejecutando si usa el directorio completo:
Este último comando estoy usando el anterior y obtengo el siguiente resultado:
fuente