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/ivana
no 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 $HOME
nã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 $HOME
seu nome de usuário. Se você puder ter coisas que pertencem corretamente a outro usuário, basta alterar a propriedade do dconf
diretó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 find
cada arquivo encontrado seja impresso com um final \0
em vez de uma nova linha, o que garante que funcionará com arquivos cujos nomes contenham caracteres de nova linha. A -z
opção de head
torna \0
a 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, -r
faz com que read
não seja tratado \
de maneira especial (portanto, \t
não se torna uma guia) e -d ''
informa read
para ler \0
os dados delimitados.