El for
-loop iterará sobre cada entrada (separada por espacios) en la cadena proporcionada.
En realidad, no ejecuta el find
comando, pero siempre que sea como una cadena (que es iterada por for
-loop). En lugar de las comillas dobles, use acentos graves o $()
:
for line in $(find . -iname '*.txt'); do
echo "$line"
ls -l "$line"
done
Además, si las rutas/nombres de sus archivos contienen espacios, este método falla (ya que el for
-loop itera sobre entradas separadas por espacios). En su lugar, es mejor usar el método descrito en la respuesta de dogbanes.
Para aclarar su error:
Como se dijo, for line in "find . -iname '*.txt'";
itera sobre todas las entradas separadas por espacios, que son:
- encontrar
- .
- -nombre
- '*.txt' (creo...)
Los dos primeros no dan como resultado un error (además del comportamiento no deseado), pero el tercero es problemático ya que se ejecuta:
ls -l -iname
Muchos comandos (bash) pueden combinar opciones de un solo carácter, por lo que -iname
es lo mismo que -i -n -a -m -e
. Y listo:tu invalid option -- 'e'
error!
Aquí hay una mejor manera de recorrer los archivos, ya que maneja los espacios y las líneas nuevas en los nombres de los archivos:
#!/bin/bash
find . -type f -iname "*.txt" -print0 | while IFS= read -r -d $'\0' line; do
echo "$line"
ls -l "$line"
done
Use la sustitución de comandos en lugar de comillas para ejecutar find en lugar de pasar el comando como una cadena:
for line in $(find . -iname '*.txt'); do
echo $line
ls -l $line;
done
Versión más compacta que trabaja con espacios y saltos de línea en el nombre del archivo:
find . -iname '*.txt' -exec sh -c 'echo "{}" ; ls -l "{}"' \;