nomes de eco e número de linhas para cada arquivo em um diretório

nomes de eco e número de linhas para cada arquivo em um diretório

Devo escrever um script de shell para o qual envio um argumento de linha de comando, que representa um diretório. Então devo repetir todos os nomes de arquivos e o número de linhas de cada arquivo desse diretório. Também devo fazer isso apenas para os 10 principais arquivos com menos de 10 minutos.

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

Foi o que tentei para encontrar os arquivos com mais de 10 minutos, mas recebi alguns erros. E também não tenho certeza de como conseguir os nomes. Agradecemos antecipadamente por toda a ajuda.

Meus nomes de arquivos são gratuitos. O erro que recebo é que a permissão é negada ao passar meu diretório pessoal como argumento. Portanto, não recebo a lista de nomes. Devo obter a lista de nomes de arquivos e o número de linhas de cada um desses arquivos.

Quando digito /bin/bash ss1 /home/ivanano terminal, recebo o seguinte erro:

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

Estou usando Linux.

Responder1

OK, as primeiras coisas primeiro. O erro que você recebe é irrelevante, significa apenas que um subdiretório específico ( /home/ivana/.cache/dconf) seu $HOMEnão pertence a você. É quase certo que isso aconteceu porque você executou um aplicativo gráfico com o sudo. A solução simples é:

sudo chown -R ivana /home/ivana/

Isso mudará a propriedade de todos os arquivos e diretórios em $HOMEseu nome de usuário. Se você puder ter coisas que pertencem corretamente a outro usuário, basta alterar a propriedade do dconfdiretório:

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

Agora, dito isso, a maneira de fazer isso corretamente e lidar com nomes de arquivos arbitrários é:

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

Isso fará com que findcada arquivo encontrado seja impresso com um final \0em vez de uma nova linha, o que garante que funcionará com arquivos cujos nomes contenham caracteres de nova linha. A -zopção de headtorna \0a entrada delimitada por leitura.

O próximo passo é ler cada um dos arquivos e imprimir o número de linhas que eles possuem:

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

Define IFS=o separador do campo de entrada como vazio, -rfaz com que readnão seja tratado \de maneira especial (portanto, \tnão se torna uma guia) e -d ''informa readpara ler \0os dados delimitados.

informação relacionada