chmod 444 em 800 arquivos no terminal Linux

0

Eu tenho quase 800 arquivos em um diretório que é /storage/. E existem 800 .dat arquivos lá que estão agora em -rw-rw-r-- permissão. Eu quero mudar todos esses arquivos para o modo somente leitura. Eu tentei isso:

find /storage/ -name "*.dat" | xargs chmod 444

na máquina local e está funcionando bem para 10 ou 20 arquivos. Mas quando eu ssh para o meu servidor e faço o mesmo comando para esses 800 arquivos, demorou 20 minutos e o comando ainda está rodando.

Existe alguma maneira específica e rápida de fazer isso? Todos os meus arquivos não estão na máquina local, mas no servidor hospedado.

Esses 800 arquivos são 30Gb cada.

Junaid Farooq
fonte

Respostas:

0

A principal diferença pode ser o tempo de pesquisa em um tempo muito maior /storage. Maio esta pasta no servidor contém uma quantidade muito grande de qualquer tipo de arquivos que aumentam a duração necessária para encontrar todos dat arquivos para esta árvore. Lado do servidor /storage pode ser lento também.

O próximo comando pode dar uma idéia disso (conta o número de arquivos e pastas em /storage ):

find /storage | wc -l

Observe também que o comando que você executa procurará cada *.dat arquivos como primeiro passo, e depois chamar chmod apenas uma vez com todos os nomes correspondentes como segundo passo.

Chamando chmod com 20 argumentos de nome de arquivo é razoável, mas o argumento de caminho de arquivo de 800 se torna um pouco demais. Seu sistema tem limitações sobre o tamanho do argumento da linha de comando xargs --show-limits ).

Eu sugiro que você pergunte diretamente find para executar seu comando que irá quebrar chmod chama em vários subconjuntos. O próximo comando irá ligar chmod uma vez por pasta contendo dat arquivos, o que parece razoável:

find /storage -type f -name '*.dat' -execdir chmod 444 '{}' \+
  • Para um garfo chmod por arquivo correspondente você precisa substituir \+ com \;
  • Para ter uma ideia melhor da progressão, você pode adicionar argumentos --changes ou --verbose para chmod ligar.
A. Loiseau
fonte
0

Você precisa depurar o problema. Gere um script com

echo '#!/bin/sh' > bigscript.sh
find /storage/ -name "*.dat" | xargs -n 1 echo chmod 444 >> bigscript.sh
chmod u+x bigscript.sh

Em seguida, edite o bigscript e coloque as informações de depuração ( echo A, echo B, ...) depois de algumas linhas e procurar por erros.

O tamanho dos arquivos não importa; 800 arquivos levam pouco tempo.

Alternativas

Alternativa simples: tente chmod -v; isso te diz o que chmod está fazendo.

Outra alternativa: encontre o PID do chmod em execução (- & gt; CHMODPID) e observe ls -l /proc/$CHMODPID/fd

u_Ltd.
fonte
find /storage/ -name "*.dat" | xargs -n 1 echo chmod 444 >> bigscript.sh é só correr e correr e apenas correr ... Poderia haver uma razão pela qual há uma operação de leitura em andamento em todos esses arquivos? Eu deveria parar a leitura op primeiro?
Junaid Farooq
800 arquivos devem demorar um pouco. Deve haver "operações de leitura" bem pesadas acontecendo. Este é um mau desempenho. Parece-me que o disco está muito lento. Ou você está usando sshfs? Eu sugiro não alterar as permissões via sshfs, mas faça o login no shell de um servidor real com ssh e digite o comando chmod lá.
u_Ltd.
O que acontece se você tentar ls -lR /storage/? Existe um lugar comum onde ele trava?
u_Ltd.
Eu só vejo uma coisa que eu corro o comando, em seguida, o cursor está apenas piscando nada acontecendo ..
Junaid Farooq
Na verdade, existe um sistema que está enviando solicitações de leitura e solicitações de gravação para esses arquivos a cada segundo.
Junaid Farooq