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


Estoy tratando de obtener el contenido de un directorio usando shell script.

Mi guión es:

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

Donde $search_dir es un camino relativo. 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, usar for entry in * y luego cambiar de nuevo, pero mi situación particular me impide hacer que.

Tengo dos rutas relativas $search_dir y $work_dir, y tengo que trabajar en ambas simultáneamente, leerlas creando/borrando archivos en ellas, etc.

Entonces, ¿qué hago ahora?

PD: Yo uso bash.

Author: David Gelhar, 2010-03-13

6 answers

for entry in "$search_dir"/*
do
  echo "$entry"
done
 180
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-04 08:10:31

Las otras respuestas aquí son geniales y responden a tu pregunta, pero este es el resultado principal de Google para "bash get list of files in directory", (que estaba buscando para guardar una lista de archivos), así que pensé en publicar una respuesta a ese problema:

ls $search_path > filename.txt

Si solo desea un cierto tipo (por ejemplo, any .archivos txt):

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

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

 19
Author: tegan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-23 16:13:51
for entry in "$search_dir"/* "$work_dir"/*
do
  if [ -f "$entry" ];then
    echo "$entry"
  fi
done
 17
Author: ghostdog74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-04 08:10:18
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}"
 10
Author: Noel Yap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-06 16:48:32

Esta es una forma de hacerlo donde la sintaxis 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 ser reemplazado por cualquier ruta
*.txt devuelve cualquier cosa.txt
Puede verificar lo que se listará fácilmente escribiendo el comando ls directamente en el terminal.

Básicamente, crea una variable yourfilenames que contiene todo lo que el comando list devuelve como un elemento separado, y luego lo recorre. El bucle crea una variable temporal eachfile que contiene un solo elemento de la variable a través de la cual está en bucle, en este caso un nombre de archivo. Esto no es necesariamente mejor que las otras respuestas, pero lo encuentro intuitivo porque ya estoy familiarizado con el comando ls y la sintaxis de bucle for.

 9
Author: rrr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-27 15:08:50

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

for entry in $search_dir/*
do
  echo $entry
done
 -1
Author: Andrushenko Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-04 18:41:38