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

Cloturernapasdesensfigure Mensajes publicados 117 Estado Miembro -  
UnGnU Mensajes publicados 1468 Estado Colaborador -
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 respuestas

  1. zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   6 502
     
    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
    1. Cloturernapasdesensfigure Mensajes publicados 117 Estado Miembro 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
    2. Cloturernapasdesensfigure Mensajes publicados 117 Estado Miembro 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
    3. karirovax Mensajes publicados 3584 Estado Miembro 215
       
      Hola,

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

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