Corrigir arquivos com ????????? permissões

5

Eu escrevi um script para alterar as permissões de todos os arquivos em um diretório:

#!/bin/bash

files='find "$1"'

for f in $files; do
    chown "$2" "$f"
    chmod 600 "$2"
done

Obviamente, o segundo argumento para chmod deve ser "$f" em vez de "$2" . No entanto, quando executei o script (em um diretório pequeno), também esqueci de incluir o segundo argumento, que deveria ter sido "dave:dave" . Agora, todos os arquivos no diretório estão completamente confusos:

~ $ ll Documents/                                                                                                      
ls: cannot access Documents/wiki.txt: Permission denied
ls: cannot access Documents/todo.txt: Permission denied
ls: cannot access Documents/modules.txt: Permission denied
ls: cannot access Documents/packages.txt: Permission denied
total 0
-????????? ? ? ? ?            ? modules.txt
-????????? ? ? ? ?            ? packages.txt
-????????? ? ? ? ?            ? todo.txt
-????????? ? ? ? ?            ? wiki.txt

A execução de sudo chown dave:dave Documents/* e sudo chmod 600 Documents/* não gera erros, mas os arquivos permanecem inalterados. Eu sei que posso sudo cat cada arquivo em um novo arquivo, mas estou curioso para saber como corrigir as permissões nos arquivos originais.

    
por David Kennedy 15.02.2016 / 07:21

2 respostas

4

Além das respostas dadas nos comentários, você também deve observar que o seu script quebrará em qualquer nome de arquivo com espaços neles.

Você pode fazer tudo isso em um único comando usando find , em vez de tentar analisar uma lista de saída de nomes de arquivos de find . Muito mais robusto; manipula nomes de arquivos independentemente de caracteres especiais ou espaço em branco.

find "$1" -type f -exec chown "$2" {} \; -exec chmod 600 {} \;

Observe que, se o chown falhar em um determinado arquivo, o chmod não será executado nesse arquivo. Esse é provavelmente o comportamento que você quer mesmo.

Como você já executou um comando incorreto que removeu as permissões de execução do diretório "Documentos", é necessário adicionar novamente as permissões de execução:

chmod u+x Documents

Se houver mais diretórios que erroneamente tenham removido as permissões de execução, você poderá corrigi-los com:

find Documents -type d -exec chmod u+x {} \;

Eu não acho que você precisará disso, já que uma vez que as permissões de execução foram removidas de "Documentos", nenhum dos seus subdiretórios estaria acessível, então as permissões de execução não seriam removidas delas.

    
por 15.02.2016 / 08:29
2

A única vez que vi arquivos com permissões tão estranhas, estava em um sistema de arquivos bagunçado sério . Uma rodada de fsck(8) levou muitos deles de volta à relativa normalidade, mas muitos ainda estavam muito corrompidos. Eu acredito que foi devido a um problema de hardware (tirei os arquivos bons do disco e os joguei).

    
por 19.02.2016 / 00:18