Posso alterar o status de bloqueio do arquivo ("somente leitura") no menu de contexto de um arquivo:
Não há item de menu para isso.
Como posso criar um item de menu do Finder (contexto) para definir, remover ou alternar esse sinalizador mais rapidamente?
Responder1
Você pode criar um novo item de menu que faça isso criando umServiçoque recebearquivos e pastascomo entrada emqualquer aplicativono Automator.
Você tem duas opções de implementação. Escolha uma das duas ações do Automator para criar o fluxo de trabalho do Serviço:
- Execute o ShellScript
- Execute o AppleScript
O código abaixo implementa oAlternarcomando, pois é o mais complexo.
Execute o ShellScript
Esta variante usa stat
para ler os sinalizadores definidos para o arquivo. Esses são os mesmos valores normalmente exibidos ao executar ls -lO
, mas stat
é uma solução mais limpa para ler os valores. O sinalizador bloqueado, ou uchg
, tem o valor 0x2
, então é isso que estamos verificando.
chflags
é usado para alterar o valor e growlnotify
, parte opcional deRosnar, usado para exibir mensagens de sucesso ou erro.
Use o seguinte snippet de código de script bash como parte da ação Executar Shell Script:
for f in "$@"
do
let "$( stat -f "%f" "$f" ) & 0x2"
if [ $? -ne 0 ] ; then
chflags uchg "$f" || /usr/local/bin/growlnotify "Error" -m "Failed to lock $f!"
/usr/local/bin/growlnotify "Locked File" -m "$f was locked!"
else
chflags nouchg "$f" || /usr/local/bin/growlnotify "Error" -m "Failed to unlock $f!"
/usr/local/bin/growlnotify "Unlocked File" -m "$f was unlocked!"
fi
done
Configure a ação para receber entradacomo argumentos.
Execute o AppleScript
Use o seguinte trecho de código AppleScript como parte da ação Executar AppleScript:
on run {input, parameters}
repeat with f in input
try
tell application "Finder" to set locked of f to (not locked of f)
on error errmsg
tell application "Finder" to display alert errmsg
end try
end repeat
end run
Se a ação falhar, por exemplo, porque faltam permissões, uma caixa de diálogo será exibida por arquivo que não foi alterado.