bash - programas - scripts linux ejercicios resueltos
¿Cómo obtener la lista de archivos en un directorio en un script de shell? (6)
En la versión de Linux que trabajo con (x86_64 GNU / Linux) siguientes trabajos:
for entry in $search_dir/*
do
echo $entry
done
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.
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 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 sintaxis de bucle for.
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"/*
do
echo "$entry"
done
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 "{}"