LS condicional en un script de Linux para bucle
Pregunta
Estoy tratando de crear un simple for
bucle que tomará todas las salidas de un ls
comando y coloque cada salida en una variable. Hasta ahora tengo
for i in ls /home/svn
do
echo $i
done
Pero me da un error.
Solución
Porque el ls
necesita ser ejecutado:
for i in $(ls ...); do
echo $i
done
Además, es posible que desee considerar Shell Globbing:
for i in /home/svn/*; do
echo $i
done
... o find
, que permite la selección de propiedades de grano muy fino para encontrar:
for i in $(find /home/svn -type f); do
echo $i
done
Además, si puede tener espacio en blanco en los segmentos de la ruta o los nombres de archivo, use un bucle de tiempo (ejemplo anterior ajustado):
find /home/svn -type f|while read i; do
echo $i
done
while
Lee en cuanto a línea, de modo que se conserva el espacio en blanco.
Sobre la llamada de basename
tienes dos opciones:
# Call basename
echo $(basename $i)
# ... or use string substitution
echo ${i##*/}
Para explicar la sustitución: ##
Elimina el patrón frontal más largo de la cadena, #
hasta la primera coincidencia de patrón, %%
el patrón más largo y atrasado y %
El primer partido completo en el fondo.
Otros consejos
No necesitas usar ls
Para repasar los archivos en este caso, lo siguiente hará el trabajo: for i in /home/svn/*; do echo $i; done
Desea asignar la salida del comando LS a I, por lo que debe encerrarlo en Backticks o el operador $ ():
for i in $(ls /home/svn)
do
echo $i
done
Eso es porque lo estás haciendo mal en primer lugar.
for i in /home/svn/*
do
echo "$i"
done