¿Cómo puedo usar word counter ( wc) y piping para contar cuántos archivos o directorios hay en el /usr/bindirectorio?
scripting
find
wc
file-types
efectivo
fuente
fuente

Respuestas:
Un enfoque sería utilizar
lspara darnos una lista de los archivos, pero queremos que se garantice que esta lista muestre solo 1 archivo o directorio por línea. El-1interruptor hará esto por nosotros.Ejemplo
Cree los datos de muestra anteriores en un directorio vacío.
Revisalo:
Ahora para contar, puede usar
wc -lpara contar el número de líneas, que corresponden a un archivo o directorio en lals -1salida.(tenga en cuenta sin embargo que no incluye los archivos ocultos)
Contando archivos o directorios, simplemente no juntos
Para contar archivos o directorios, debe cambiar ligeramente su táctica. En este caso, lo usaría
ls -lya que muestra qué es un directorio y qué es un archivo.Ejemplo
Luego podemos usar
greppara filtrar directorios o no directorios de esta manera:Ahora solo use
wc -lnuevamente para contar lo anterior:Sin embargo, puede evitar por
wccompleto y usargrepla-copción:(de nuevo, los archivos ocultos no están incluidos. Tenga en cuenta que los directorios y los archivos regulares son dos tipos de archivos. Hay muchos más como canalizaciones con nombre, enlaces simbólicos, dispositivos, enchufes ...).
Recursividad
Si necesita encontrar los archivos y directorios de forma recursiva,
/usr/binentonces es probable que desee cambiar las tácticas por completo y utilizar otra herramienta llamadafind.Ejemplo
(aunque arriba
/usr/binestá incluido en el recuento)Las mismas técnicas que utilicé anteriormente podrían emplearse
lspara hacer algo similar, perolsgeneralmente no es una buena herramienta para analizar la salida.findPor otro lado, se creó para esto y ofrece conmutadores para buscar archivos o directorios.(tenga en cuenta que esta vez,
findincluye archivos ocultos (excepto.y..)).nuevas líneas?
Nunca he descubierto por qué un carácter de nueva línea es un carácter legal para usar al crear nombres de archivo o nombres de directorio. Entonces, los métodos discutidos anteriormente usan
wcylsno competirían con estos, así que úselos con eso en mente.Ejemplo
Cree un directorio y nombre de archivo con nuevas líneas.
lslos muestra correctamente:Pero
wccuenta los directorios y archivos que contienen nuevas líneas como 2 elementos, no uno.Un método para evitar esto, si utiliza la implementación de GNU
findes utilizarfindla capacidad de imprimir algo más en lugar de cada archivo que encuentra y luego contarlos.Ejemplo
Aquí estamos encontrando todo en el directorio actual (excepto
..), y la impresión de un punto (.) para cada uno, y luego contar los puntos que utilizanwc's capacidad de contar bytes en lugar de líneas,wc -c.Referencias
fuente
/usr/binestarán bien formateados (y tampoco contendrán espacios, por lo que técnicamente podría simplementeecho * | wc -w), vale la pena señalar que todos estos se romperán en los nombres de archivo que contienen nuevas líneas.ls -lols -1romperé b / c, estamos contando líneas, no palabras! Elfindpuede romper, pero de nuevo, estamos contando líneas no palabras.touch $'foo\nbar'dentro de un directorio vacío seguido de uno de sus comandos (digamosls -1 | wc -l) informará dos archivos en lugar de uno, porque ese archivo tiene dos líneas en lo quewcrespecta. A menos quelsreemplace las líneas nuevas con algún otro personaje (no creo que lo haga, pero nuevamente no estoy en condiciones de probarlo en este momento).wc -cun problema al contar los períodos?Si desea obtener un desglose del número de cada tipo de archivo de forma recursiva en algún directorio, con GNU
find, puede hacer:En
/usr/binmi sistema, eso da:En
/dev:Para los enlaces simbólicos, si prefiere contarlos como el tipo de archivo al que apuntan en lugar de hacerlo
symbolic links, puede cambiarlo a:Lo que ahora da por mi
/usr/bin:(un enlace simbólico roto es un enlace simbólico a un archivo para el que
findno se puede determinar el tipo, ya sea porque el archivo no existe, o está en un directorio al que no tiene acceso o hay un bucle en la resolución de la ruta del archivo En mi caso, esos 2 eran enlaces simbólicos a archivos que ahora se han ido).Ninguno de esos cuenta
.y... Si quisieras incluirlos (¿por qué lo harías?), No hay otra formafindde asumir que están allí para cada directorio y contarlos sistemáticamente:Que luego da en mi
/usr/bin:Si no tiene acceso a GNU
find, puede reescribir el primero como:Ahora, estrictamente hablando, no hemos estado contando archivos sino entradas de directorio . Un directorio como
/usr/binsuele tener varias entradas que apuntan al mismo archivo. Por ejemplo, aquí tengo:Esas son 3 entradas de directorio (también conocidas como nombres de archivos también conocidos como enlaces duros) al mismo archivo (el que tiene el inodo 672252. Para contar archivos en lugar de entradas de directorio y con GNU
findy GNUuniq(ignorando.y..archivos que de todos modos son enlaces duros a otros directorios):En mi
/usr/bin, eso da:fuente
No ha dicho si quiere todo el archivo en / usr / bin de forma recursiva o solo en el primer nivel. Además, ¿cómo vas a obtener las palabras que estás contando? La forma habitual de averiguarlo es ejecutar find en wc. De esta manera: find / usr / bin | wc -l Find enumerará todo lo que hay allí, directorios y archivos. Wc -l contará todas las líneas en la salida de búsqueda. ¿Es esta una tarea de clase? Está bien si es así, pero me preguntaba por qué necesitabas esta información para poder adaptar la respuesta con más cuidado. Avísame si necesitas más. Costa
fuente
En bash, sin herramientas externas.
En bash, sin herramientas externas y recursividad.
fuente
.ni las..entradas. Es posible que desee desagregar el archivo frente al archivo normal.