Isso deve funcionar:
find /home/user -type d -print0 | xargs -0 chmod 0775
find /home/user -type f -print0 | xargs -0 chmod 0664
Alguém tem uma ferramenta ou script que corrigirá recursivamente as permissões de arquivo em um diretório?
Em uma máquina Ubuntu Linux, vários arquivos foram copiados para um disco USB com permissões 777 completas (usuário, grupo, outros - ler, gravar, executar) com erro. Eu quero colocá-los de volta no diretório do usuário corrigido.
Os diretórios devem ser 775 e todos os outros arquivos podem ser 664. Todos os arquivos são imagens, documentos ou MP3s, portanto nenhum deles precisa ser executável. Se o bit de diretório estiver configurado, ele precisará de execução; de outro modo, ele só precisa de usuário e grupo, ler e gravar.
Eu achei que valia a pena verificar se tal utilitário existia antes de hackear um shell script:)
encontrar pode fazer o truque sozinho com -exec:
find /home/user -type f -exec chmod 0664 {} \;
find /home/user -type d -exec chmod 0775 {} \;
para evitar que o encontro crie um chmod para cada entrada:
find /home/user -type f -exec chmod 0664 {} +
find /home/user -type d -exec chmod 0775 {} +
(isso efetivamente chama chmod uma vez com a lista de todos os arquivos como parâmetros, em vez de um chmod por arquivo)
Esta resposta não resolve o seu problema, mas alguém pode achá-la útil para um problema semelhante em que os arquivos têm menos permissão do que deveriam.
# chmod -R . u=rwX,g=rX,o=rX
A mágica é a permissão X, ao invés de x. A chmod manpage descreve da seguinte forma:
execute/search only if the file is a directory or already has execute permission for some user
Isso não é adequado no seu caso, pois seus arquivos têm permissão de execução, portanto, corresponderá ao segundo teste.
Eu fiz um script com a solução do freiheit, ele adiciona a verificação básica de argumentos.
#!/bin/sh
if [ $# -lt 1 ]; then
echo "USAGE: $0 <path>"
exit 1
fi
find $1 -type d -print0 | xargs -0 chmod 0755
find $1 -type f -print0 | xargs -0 chmod 0644
Caso você esteja usando o ssh, é uma boa ideia não modificar ~/.ssh
permissões.
DIR=/home/user
find $DIR -type d -not -path "$DIR/.ssh" -print0 | xargs -0 chmod 0775
find $DIR -type f -not -path "$DIR/.ssh/*" -print0 | xargs -0 chmod 0664
Eu fiz um script muito simples no outro dia porque precisava corrigir as permissões. Por que não há um utilitário formal para redefinir as permissões básicas de arquivos e pastas, não raiz?
O script usa find para 755 todas as pastas e 644 bibliotecas. Em seguida, ele testa cada arquivo com o readelf para ver se ele possui um cabeçalho elf binário. Se não, ele digitaliza nos dois primeiros caracteres para shebang #!
. Ele 755 essas instâncias e 644 todo o resto depois de verificar se o arquivo já tem a permissão correspondente.
Casos especiais são tratados com uma exceção como *.bak
para arquivos a serem ignorados.
#!/bin/bash
read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
echo "Processing ..."
find -H $(pwd) -type d -exec chmod 0755 {} \;
# set dirs to 755
find -H $(pwd) -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
# libs
IFS=$'\n'
for value in $(find -H $(pwd) -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n'); do
tstbin=$(readelf -l "$value" 2>/dev/null | grep -Pio 'executable|shared')
if [ -z "$tstbin" ]; then
tstbat=$(cat "$value" | head -c2 | grep -io '#!')
if [ -n "$tstbat" ]; then
perm=$(stat -c '%a' "$value")
if [ "$perm" != "755" ]; then
chmod 755 $value
echo "Set script 755 $value"
# set batch to 755
fi
else
perm=$(stat -c '%a' "$value")
if [ "$perm" != "644" ]; then
chmod 644 $value
echo "Set regular 644 $value"
# set regular files to 644
fi
fi
# above aren't elf binary
else
perm=$(stat -c '%a' "$value")
if [ "$perm" != "755" ]; then
chmod 755 $value
echo "Set binary 755 $value"
# set elf binaries to 755
fi
fi
done
unset IFS
# process linux permissions for files and folders
else
echo "Aborted."
fi