Si lo hago ls -1 target_dir | wc -l, obtengo un recuento de archivos en un directorio. Esto me parece un poco engorroso. ¿Hay alguna forma más elegante o sucinta?
                    
                        ubuntu
                                command-line
                                filesystems
                                
                    
                    
                        codecowboy
fuente
                
                fuente

lsYa da el recuento total, ¿qué talls -l | head -1? Conviértelo en un alias si quieres algo más corto.ls -lindica el tamaño total de los archivos, no el número de archivos.ls | wc -lle dará un recuento incorrecto si algún nombre de archivo contiene nuevas líneas.stat -c %h .da la misma información quels -ld . | cut -d" " -f 2Respuestas:
Suponiendo bash 4+ (que tiene cualquier versión compatible de Ubuntu):
Llámalo como
num_files [dir].dires opcional, de lo contrario, utiliza el directorio actual. Su versión original no cuenta los archivos ocultos, por lo que tampoco lo hace. Si quieres eso,shopt -s dotglobantesset -- *.Su ejemplo original cuenta no solo los archivos normales, sino también los directorios y otros dispositivos; si realmente solo desea archivos regulares (incluidos los enlaces simbólicos a archivos normales), deberá verificarlos:
Si tiene GNU find, algo como esto también es una opción (tenga en cuenta que esto incluye archivos ocultos, que su comando original no hizo):
(cambie
-typea-xtypesi también desea contar enlaces simbólicos a archivos normales).fuente
setfallará si hay muchos archivos? Creo que es posible que tenga que usarxargsun código de suma para que funcione en el caso general.shopt -s dotglobsi desea.contar los archivos que comienzan consetque falle en estas circunstancias, ya que en realidad no estamos haciendo unexec. A saber, en mi sistema,getconf ARG_MAXproduce 262.144, pero si lo hagotest_arg_max() { set -- {1..262145}; echo $#; }; test_arg_max, felizmente responde 262145.-maxdepthno es POSIX.f=(target_dir/*);echo ${#f[*]}funciona correctamente para archivos con espacios, líneas nuevas, etc. en el nombre.
fuente
lses de varias columnas solo si sale directamente a un terminal, puede eliminar la opción "-1", puede eliminar lawcopción "-l", solo leer el primer valor (solución diferida, no se debe usar para evidencias leguales, investigaciones criminales, misiones críticas, operaciones tácticas ...).fuente
wcpara obtener el número de archivos, incluso en el caso trivial, entonces, ¿cómo es esto incluso una solución?targetes un globo que, cuando se expande, incluye algunas cosas que comienzan con guiones. Por ejemplo, crea un nuevo directorio, entra en él y hazlotouch -- {1,2,3,-a}.txt && ls *|wc(NB:rm -- *.txtwc -l? De lo contrario, obtendrá recuentos de línea nueva, palabra y byte de lalssalida. Eso es lo que dijo David Richerby: hay que analizarlo nuevamente.wcargumentos que no necesites analizar si tu cerebro sabe que el primer argumento es nueva línea.Si se trata de la concisión que está buscando (en lugar de la corrección exacta cuando se trata de archivos con nuevas líneas en sus nombres, etc.), te recomiendo aliasing
wc -lalc( "número de líneas"):Como otros han señalado, no necesita la
-1opciónls, ya que es automática cuandolsse escribe en una tubería. (A menos que tenga unlsalias para usar siempre el modo de columna. Lo he visto antes, pero no con mucha frecuencia).Un
lcalias es bastante útil en general, y para esta pregunta, si nos fijamos en el caso de "contar el directorio actual",ls|lces lo más sucinto posible.fuente
Hasta ahora, Aaron's es el único enfoque más sucinto que el suyo. Una versión más correcta de su enfoque podría verse así:
Eso enumera recursivamente todos los archivos, no directorios, uno por línea, incluidos los archivos .dot debajo del directorio actual, utilizando globos de shell según sea necesario para reemplazar los caracteres no imprimibles. grep filtra cualquier listado de directorio padre o ... o * / o líneas en blanco, por lo que solo debe haber una línea por archivo, el recuento total de qué grep regresa a usted. Si desea incluir directorios secundarios también:
Elimine el
-Ren cualquier caso si no desea resultados recursivos.fuente
find. Si solo desea un conteo, esto debería funcionar:find -mindepth 1 -maxdepth 1 -printf '\n'|wc -l(elimine los controles de profundidad para obtener resultados recursivos).find . \! -name . -prune | wc -l- que todavía no funciona, por supuesto.printfinstrucción imprime una cadena constante (una nueva línea) que no incluye el nombre del archivo, por lo que los resultados son independientes de cualquier nombre de archivo extraño. Este truco no se puede hacer en absoluto con unofindque no es compatibleprintf, por supuesto.find .//. \!. -name . -prune | grep -c '^\.//\.'/Siendo el único otro personaje que no puede aparecer en los nombres de archivo,.//.se garantiza que la secuencia aparezca exactamente una vez para cada archivo, ¿verdad? sin embargo, un par de preguntas: ¿.//.por qué y por qué-prune? ¿Cuándo diferiría estofind . \! -name . | grep -c '^\.'? (Supongo que.en su\!.es un error tipográfico.)