¿Cómo puedo usar word counter ( wc
) y piping para contar cuántos archivos o directorios hay en el /usr/bin
directorio?
scripting
find
wc
file-types
efectivo
fuente
fuente
Respuestas:
Un enfoque sería utilizar
ls
para darnos una lista de los archivos, pero queremos que se garantice que esta lista muestre solo 1 archivo o directorio por línea. El-1
interruptor hará esto por nosotros.Ejemplo
Cree los datos de muestra anteriores en un directorio vacío.
Revisalo:
Ahora para contar, puede usar
wc -l
para contar el número de líneas, que corresponden a un archivo o directorio en lals -1
salida.(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 -l
ya que muestra qué es un directorio y qué es un archivo.Ejemplo
Luego podemos usar
grep
para filtrar directorios o no directorios de esta manera:Ahora solo use
wc -l
nuevamente para contar lo anterior:Sin embargo, puede evitar por
wc
completo y usargrep
la-c
opció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/bin
entonces es probable que desee cambiar las tácticas por completo y utilizar otra herramienta llamadafind
.Ejemplo
(aunque arriba
/usr/bin
está incluido en el recuento)Las mismas técnicas que utilicé anteriormente podrían emplearse
ls
para hacer algo similar, perols
generalmente no es una buena herramienta para analizar la salida.find
Por otro lado, se creó para esto y ofrece conmutadores para buscar archivos o directorios.(tenga en cuenta que esta vez,
find
incluye 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
wc
yls
no competirían con estos, así que úselos con eso en mente.Ejemplo
Cree un directorio y nombre de archivo con nuevas líneas.
ls
los muestra correctamente:Pero
wc
cuenta 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
find
es utilizarfind
la 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/bin
estará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 -l
ols -1
romperé b / c, estamos contando líneas, no palabras! Elfind
puede 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 quewc
respecta. A menos quels
reemplace 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 -c
un 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/bin
mi 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
find
no 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 formafind
de 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/bin
suele 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
find
y 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.