nombres de eco y número de líneas para cada archivo en un directorio

nombres de eco y número de líneas para cada archivo en un directorio

Se supone que debo escribir un script de shell al que envío un argumento de línea de comando, que representa un directorio. Luego se supone que debo repetir todos los nombres de archivos y el número de líneas para cada archivo de ese directorio. También se supone que debo hacer esto solo para los 10 archivos principales que no tengan más de 10 minutos.

find "$1" -cmin -10 -type f | head -10 

Esto es lo que intenté para encontrar archivos de más de 10 minutos, pero obtuve algunos errores. Y tampoco estoy seguro de cómo conseguir los nombres. Gracias de antemano por toda la ayuda.

Los nombres de mis archivos son gratuitos. El error que recibo es que se deniega el permiso al pasar mi directorio de inicio como argumento. Entonces no recibo la lista de nombres. Se supone que debo obtener la lista de nombres de archivos y el número de líneas de cada uno de esos archivos.

Cuando escribo /bin/bash ss1 /home/ivanaen la terminal, aparece el siguiente error:

find: '/home/ivana/.cache/dconf': Permission denied

Estoy usando Linux.

Respuesta1

Bien, lo primero es lo primero. El error que obtiene es irrelevante, solo significa que un subdirectorio específico ( /home/ivana/.cache/dconf) suyo $HOMEno es de su propiedad. Es casi seguro que esto sucedió porque ejecutó una aplicación gráfica con sudo. La solución simple es:

sudo chown -R ivana /home/ivana/

Eso cambiará la propiedad de todos los archivos y directorios en su $HOMEespalda a su propio nombre de usuario. Si puede tener cosas allí que pertenecen correctamente a otro usuario, simplemente cambie la propiedad del dconfdirectorio:

sudo chown -R ivana /home/ivana/.cache/dconf

Ahora bien, dicho esto, la forma de hacer esto correctamente y tratar con nombres de archivos arbitrarios es:

find "$1" -cmin -10 -type f -print0 | head -z -n 10 

Esto hará que findse imprima cada archivo encontrado con un final \0en lugar de una nueva línea, lo que garantiza que funcionará con archivos cuyos nombres contengan caracteres de nueva línea. La -zopción de headhace que sea lectura \0-entrada delimitada.

El siguiente paso es leer cada uno de los archivos e imprimir la cantidad de líneas que tienen:

find "$1" -cmin -10 -type f -print0 | head -z -n 10 |
    while IFS= read -r -d '' file; do wc -l "$file"; done

Establece IFS=el separador de campo de entrada en vacío, no lo trata -respecialmente (por lo que no se convierte en una pestaña) y le indica que se lean datos delimitados.read\\t-d ''read\0

información relacionada