Shell: contar el número de archivos en un folder... complicado

Cloturernapasdesensfigure Mensajes publicados 117 Estado Membre -  
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.

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! :)

5 réponses

zipe31 Mensajes publicados 34620 Fecha de registro   Estado Contributeur Última intervención   6 499
 
Hola,

Quizás no sea la solución más optimizada:

ls cc >/dev/null && ls cc | wc -l


--
_______________________________ ☯ Zen mis nuggets ☮ ______________________________
Hagan un gesto por el medio ambiente, cierren sus ventanas y adopten un pingüino… 🐧
0
Cloturernapasdesensfigure Mensajes publicados 117 Estado Membre 5
 
:)
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.

GNU-bash-4.1.2 $ ls aa>/dev/null && ls aa | wc -l || echo ERROR
1
GNU-bash-4.1.2 $ ls bb>/dev/null && ls bb | wc -l || echo ERROR
0
GNU-bash-4.1.2 $ ls cc>/dev/null && ls cc | wc -l || echo ERROR
ls: no se puede acceder a cc: No existe el archivo o directorio
ERROR
GNU-bash-4.1.2 $


¡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.)
0
Cloturernapasdesensfigure Mensajes publicados 117 Estado Membre 5
 
Hola de nuevo,
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.
0
karirovax Mensajes publicados 3584 Estado Membre 215
 
Hola,

find /ruta/ -type f es para archivos, usa -type d para los directorios.
0
karirovax Mensajes publicados 3584 Estado Membre 215
 
ejemplo para el directorio actual si queremos saber cuántos directorios hay:

find . -type d -name "*" | wc -l
0