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

1

Eu devo escrever um script de shell para o qual eu envio um argumento de linha de comando, que representa um diretório. Então, devo fazer eco de todos os nomes de arquivos e 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 

Isso é o que eu tentei para encontrar os arquivos mais novos que 10 minutos, mas eu recebi alguns erros. E também não sei como obter 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 home como argumento. Então eu não entendo a lista de nomes. Eu deveria obter a lista de nomes de arquivos e o número de linhas de cada um desses arquivos.

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

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

Estou usando o Linux.

    
por ivana14 31.05.2017 / 15:27

1 resposta

2

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

sudo chown -R ivana /home/ivana/

Isso alterará a propriedade de todos os arquivos e diretórios em $HOME para seu próprio nome de usuário. Se você pode ter coisas que são de propriedade correta de outro usuário, apenas altere a propriedade do diretório dconf :

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 find imprima cada arquivo encontrado com um -z em vez de uma nova linha, o que garante que ele funcionará com arquivos cujos nomes contenham caracteres de nova linha. A opção head de IFS= faz com que ela leia a entrada -r -delimited.

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

O read define o separador do campo de entrada como vazio, o \ torna \t não tratar -d '' especialmente (assim, read não se torna uma guia) e %code% informa %code% para ler %code% -delimited data.

    
por 31.05.2017 / 16:21