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.
6 answers
for entry in "$search_dir"/*
do
echo "$entry"
done
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.
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
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 "{}"
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.
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
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