Shell: contar el número de archivos en un folder... complicado
Cloturernapasdesensfigure
Mensajes publicados
117
Estado
Membre
-
UnGnU Mensajes publicados 1468 Estado Contributeur -
UnGnU Mensajes publicados 1468 Estado Contributeur -
Hola,
Quisiera hacer un pedido, o una serie de pedidos, o crear un script para contar el número de archivos en un directorio, y si el "ls" falla, mostrar un error. Quiero aclarar que deseo ejecutar el ls y mostrar un error si falla, y no determinar de antemano si el ls va a fallar.
Para probar he creado:
Un directorio llamado aa que contiene un solo archivo llamado "h h"
Un directorio llamado bb que no contiene ningún archivo
Utilizo ls $dossier | wc -l para conocer el número de archivos.
Problema: si "ls" falla, el wc -l que se ejecuta en paralelo devuelve 0.
He intentado almacenar el resultado del "ls" en una variable, pero en ese caso pierdo la última línea en blanco del resultado del "ls", y wc -l da un resultado incorrecto.
¿Tienes una mejor idea? ¿Cómo solucionarías este problema?
¡Gracias! :)
Quisiera hacer un pedido, o una serie de pedidos, o crear un script para contar el número de archivos en un directorio, y si el "ls" falla, mostrar un error. Quiero aclarar que deseo ejecutar el ls y mostrar un error si falla, y no determinar de antemano si el ls va a fallar.
Para probar he creado:
Un directorio llamado aa que contiene un solo archivo llamado "h h"
Un directorio llamado bb que no contiene ningún archivo
Utilizo ls $dossier | wc -l para conocer el número de archivos.
Problema: si "ls" falla, el wc -l que se ejecuta en paralelo devuelve 0.
GNU-bash-4.1.2 $ ls
aa bb
GNU-bash-4.1.2 $ ls aa |wc -l
1
GNU-bash-4.1.2 $ ls bb |wc -l
0
GNU-bash-4.1.2 $ ls cc | wc -l
ls: no se puede acceder a cc: No existe el archivo o el directorio
0
GNU-bash-4.1.2 $
He intentado almacenar el resultado del "ls" en una variable, pero en ese caso pierdo la última línea en blanco del resultado del "ls", y wc -l da un resultado incorrecto.
¿Tienes una mejor idea? ¿Cómo solucionarías este problema?
¡Gracias! :)
Lo había considerado en un momento, pero sin probarlo porque implica hacer el ls dos veces y no me gustaba eso.
Pero tengo que reconocer su eficacia.
¡Lo acepto!
¡Gracias!
(Voy a intentar adaptarlo también con un find para contar realmente el número de archivos, incluyendo posibles archivos con un "\n" en el nombre. Si no hay otro comando más simple dedicado a eso.)
Aún así me gustaría encontrar una solución limpia.
No puedo hacerlo.
He intentado de muchas maneras, sin éxito, aquí está mi último intento (horrible):
if lista="$(find aa -type f -print0)"; then od -c <<<"$lista" | fgrep -o '\0' |wc -l; else echo "ERROR"; fi
Sin embargo, creo que estoy intentando hacer algo simple, ¿verdad? Contar limpiamente el número de archivos en un directorio.
¿Ve usted otra manera de hacerlo, por favor?
Mis dificultades:
- pasar por una variable temporal suprime la información del último salto de línea y todos los caracteres binarios NULL.
(Me gustaría no tener que crear archivos temporales solo por eso)
- poner comandos entre "|" en un comando entre $( ) hace que no pueda saber si hubo un error en la ejecución del primer comando, incluso con $PIPESTATUS.
find /ruta/ -type f es para archivos, usa -type d para los directorios.
find . -type d -name "*" | wc -l