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
ls
Ya da el recuento total, ¿qué talls -l | head -1
? Conviértelo en un alias si quieres algo más corto.ls -l
indica el tamaño total de los archivos, no el número de archivos.ls | wc -l
le 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 2
Respuestas:
Suponiendo bash 4+ (que tiene cualquier versión compatible de Ubuntu):
Llámalo como
num_files [dir]
.dir
es 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 dotglob
antesset -- *
.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
-type
a-xtype
si también desea contar enlaces simbólicos a archivos normales).fuente
set
fallará si hay muchos archivos? Creo que es posible que tenga que usarxargs
un código de suma para que funcione en el caso general.shopt -s dotglob
si desea.
contar los archivos que comienzan conset
que falle en estas circunstancias, ya que en realidad no estamos haciendo unexec
. A saber, en mi sistema,getconf ARG_MAX
produce 262.144, pero si lo hagotest_arg_max() { set -- {1..262145}; echo $#; }; test_arg_max
, felizmente responde 262145.-maxdepth
no es POSIX.f=(target_dir/*);echo ${#f[*]}
funciona correctamente para archivos con espacios, líneas nuevas, etc. en el nombre.
fuente
ls
es de varias columnas solo si sale directamente a un terminal, puede eliminar la opción "-1", puede eliminar lawc
opció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
wc
para obtener el número de archivos, incluso en el caso trivial, entonces, ¿cómo es esto incluso una solución?target
es 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 -- *.txt
wc -l
? De lo contrario, obtendrá recuentos de línea nueva, palabra y byte de lals
salida. Eso es lo que dijo David Richerby: hay que analizarlo nuevamente.wc
argumentos 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 -l
alc
( "número de líneas"):Como otros han señalado, no necesita la
-1
opciónls
, ya que es automática cuandols
se escribe en una tubería. (A menos que tenga unls
alias para usar siempre el modo de columna. Lo he visto antes, pero no con mucha frecuencia).Un
lc
alias es bastante útil en general, y para esta pregunta, si nos fijamos en el caso de "contar el directorio actual",ls|lc
es 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
-R
en 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.printf
instrucció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 unofind
que 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.)