Como localizo e modifico permissões em um tipo de arquivo em um terminal Ubuntu? [duplicado]

1

Acabei de atualizar do Ubuntu 8.04 para 9.04, adicionei um disco rígido extra para /home e usei um iPod (FAT32, infelizmente) para armazenar / transferir os arquivos temporariamente.

Copiando esses arquivos de volta Descobri que a maioria dos arquivos, eu acho que devido aos problemas de permissões não configurados / definidos incorretamente no FAT32, agora foram efetivamente chmod +x 'ed em algum momento.

Eu queria saber se há uma maneira fácil de encontrar todos os arquivos de um determinado tipo (por exemplo, .txt ou .css ) e encaminhar isso diretamente para chmod -x ? Eu tentei pesquisar com várias frases neste site e várias outras, mas não consegui encontrar nada. Embora isso possa ser um problema de vocabulário, eu acho.

Obrigado por qualquer ajuda que vocês possam fornecer e pelo seu tempo.

    
por David Thomas 12.09.2009 / 22:31

4 respostas

3
chmod -R a-x *.txt

seria um exemplo disso, mas você teria que repeti-lo para todos os padrões de arquivo diferentes.

    
por 12.09.2009 / 22:49
0

A linha de comando também pode usar a sintaxe do tipo regexp, então você só precisa executar o comando uma vez.

cd /to/my/directory
chmod -R a-x *.(txt|css|whatever)

ok, eu tentei testá-lo, mas não está exatamente funcionando, estou procurando a sintaxe correta, mas sei que é possível. Thx.

Nesse meio tempo ..

Isso definitivamente funciona (e é definitivamente um exagero):

find /to/my/directory -type f | egrep "(txt|css)$" | xargs -t -i{} chmod a-x {}

Explicação:

O comando find listará todos os arquivos, links e diretórios, cada um em uma linha separada. O nome do caminho especifica o ponto de partida. A opção -type f especifica para localizar somente arquivos.

o comando egrep produzirá todas as linhas que corresponderem à expressão regular. A expressão "(txt|css)$" regular diz para corresponder a todos os arquivos que terminam com ($) com txt ou css.

o comando xargs vai pegar a saída de um comando e canalizá-lo para a entrada de outro comando (que vem depois dele). por exemplo:

$> echo a\nb\nc 
a
b
c

$> echo a\nb\n\c | xargs echo
a b c

Então, normalmente, você poderia fazer find -type f | xargs echo , mas a saída às vezes pode ficar muito longa se você tiver muitos arquivos, então acho melhor separá-los. soo. a opção -i executa o comando para cada linha de saída, o valor de cada linha é armazenado em uma variável, definida como {}. o comando -t gera cada comando que é gerado para o std out, para que você possa ver o que está acontecendo.

    
por 12.09.2009 / 23:18
0

Como resposta à sua pergunta atual, a descoberta | A solução xargs é a correta.

No entanto, para resolver seu problema raiz, é impossível restaurar corretamente todas as permissões de arquivo sem uma referência. Se você tiver espaço, você pode criar uma máquina virtual, instalar todos os mesmos pacotes (para descobrir como, procurar pelo dpkg obter seleções de conjuntos) como sua máquina real, e então "copiar" as permissões usando a opção --reference de chmod.

Se você decidir seguir esse caminho, posso editar minha postagem com instruções mais detalhadas.

    
por 13.09.2009 / 05:45
0

Ah, descobrir a maneira mais difícil que você deveria ter usado o tar para voltar / restaurar. : (

find . -type f -name '*.txt' -exec chmod -x {} +

Ou com qualquer outro seletor desejado, por exemplo, find -regextype posix-extended . -type f -iregex '.*\.(txt|css|html)' -exec chmod -x {} +

Na verdade, quase nada em seu diretório pessoal deve ser executável, então eu começaria com apenas find -type f (sem -name) e, em seguida, tornaria as coisas executáveis conforme necessário. Talvez chmod para o modo 664, se você acabou com o modo tudo 777, já que você não quer permissão de gravação do mundo em seus arquivos (ou diretórios também). Então, na verdade chmod o-w -R ~ é uma boa ideia.

Alguns arquivos não podem ser lidos por outros usuários na mesma máquina, por exemplo, ~ / .bash_history, ~ / .ssh, ~ / Mail e assim (com base no que eu tenho em meu diretório inicial que pode realmente importar)

    cd
    chmod 600 .bash_history .esd_auth .githistory  .ICEauthority .lesshst .mcoprc .netrc* .pulse-cookie .recently-used* .viminfo .Xauthority .xsession-errors
    chmod 700 .dbus .gconf* .gnome* .gnupg .icedteaplugin .kde .macromedia .metacity Mail .mozilla .openoffice.org* .pulse .purple .Skype .ssh .thumbnails .tsclient .update-notifier

    chmod 2700 .gnupg  # super-ultra-paranoid, I guess.
    chmod 500 .gvfs  # gvfs is weird, and maybe not present on current ubuntu?

copie / cole em um terminal. Não se preocupe com erros, tenho certeza que você não tem todos os mesmos dotfiles e diretórios que eu faço. (e deixei de fora muitos obscuros que são realmente apenas diretórios de salvamento de jogos, e poderiam ser publicamente legíveis sem danos.) Geralmente, se você não quer que seu repositório pr0n ou qualquer menção a ele apareça em outros usuários localizar resultados ou outras pesquisas, verifique se seus arquivos de histórico e assim por diante são particulares.

    
por 10.12.2009 / 04:36