¿Cómo obtener la lista de archivos en un directorio en un script de shell?

Estoy tratando de obtener los contenidos de un directorio usando un script de shell.

Mi guion es:

for entry in `ls $search_dir`; do echo $entry done 

donde $search_dir es una ruta relativa. Sin embargo, $search_dir contiene muchos archivos con espacios en blanco en sus nombres. En ese caso, este script no se ejecuta como se esperaba.

Sé que podría usar for entry in * , pero eso solo funcionaría para mi directorio actual.

Sé que puedo cambiar a ese directorio, utilizar for entry in * luego volver a cambiar, pero mi situación particular me impide hacerlo.

Tengo dos rutas relativas, $search_dir y $work_dir , y tengo que trabajar en ambas simultáneamente, leyéndolas creando / eliminando archivos en ellas, etc.

¿Entonces qué hago ahora?

PD: uso bash.

 for entry in "$search_dir"/* do echo "$entry" done 

Las otras respuestas aquí son excelentes y responden a su pregunta, pero este es el resultado de google superior para “bash get list of files in directory” (que estaba buscando para guardar una lista de archivos) así que pensé en publicar un respuesta a ese problema:

 ls $search_path > filename.txt 

Si solo desea un tipo determinado (por ejemplo, cualquier archivo .txt):

 ls $search_path | grep *.txt > filename.txt 

Tenga en cuenta que $ search_path es opcional; ls> filename.txt hará el directorio actual.

 for entry in "$search_dir"/* "$work_dir"/* do if [ -f "$entry" ];then echo "$entry" fi done 
 find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}" 

Esta es una forma de hacerlo donde la syntax es más simple de entender para mí:

 yourfilenames=`ls ./*.txt` for eachfile in $yourfilenames do echo $eachfile done 

./ es el directorio de trabajo actual, pero podría reemplazarse con cualquier ruta
*.txt devuelve anything.txt
Puede verificar lo que se enumerará fácilmente escribiendo el comando ls directamente en la terminal.

Básicamente, usted crea una variable yourfilenames contienen todo lo que el comando list devuelve como un elemento separado, y luego lo repite. El ciclo crea una variable temporal cada eachfile que contiene un solo elemento de la variable por la que está pasando, en este caso un nombre de archivo. Esto no es necesariamente mejor que las otras respuestas, pero me parece intuitivo porque ya estoy familiarizado con el comando ls y la syntax de bucle for.

En la versión de Linux que trabajo con (x86_64 GNU / Linux) siguientes trabajos:

 for entry in $search_dir/* do echo $entry done