Estou tentando usar o Apple Automator para rotular pastas vazias em uma hierarquia. Basicamente, começo um projeto com uma hierarquia de pastas vazias e preencho-as enquanto trabalho. Quero que um fluxo de trabalho rotule todas as pastas vazias (cinza) que não contêm arquivos e seus descendentes também não contêm arquivos.
Ou seja, quando eu crio o projeto vazio, todas as pastas devem ficar cinza, pois não existem "arquivos" em lugar nenhum, apenas pastas vazias. No entanto, uma vez que eu coloque um arquivo em algum lugar, seu pai e todos os seus avós não serão mais rotulados como cinza.
Achei que tinha encontrado o que precisava emComo alterar a aparência de pastas vazias no Finder?no entanto, ele está rotulando pastas vazias. No meu projeto, apenas os últimos descendentes ficariam cinza porque todas as pastas pai contêm pastas, portanto, não vazias.
Aqui está o código que estou executando em um script shell /bin/bash no Automator:
find "$@" -type d -empty
E então estou passando para um "Localizador de rótulos" para tornar os resultados cinza.
Aqui está o resultado que estou obtendo quando executado em uma pasta de teste:
- Pasta de teste (não cinza)
- Pasta Um (cinza)
- Pasta dois (não cinza)
- Pasta A (cinza)
- Pasta Três (não cinza)
- Teste.txt
- Pasta Quatro (não cinza)
- Pasta A (não cinza)
- Teste.txt
- Pasta A (não cinza)
E aqui está o resultado que estou procurando:
- Pasta de teste (não cinza)
- Pasta Um (cinza)
- Pasta Dois (cinza)
- Pasta A (cinza)
- Pasta Três (não cinza)
- Teste.txt
- Pasta Quatro (não cinza)
- Pasta A (não cinza)
- Teste.txt
- Pasta A (não cinza)
Qualquer ajuda será muito apreciada!
Ah, também acredito que posso executar o fluxo de trabalho de Hazel. Se você tiver uma maneira melhor de executá-lo automaticamente de vez em quando, adoraria saber isso também.
Obrigado.
Editar: Acabei de perceber que os arquivos .ds_store (presumo) estão fazendo com que as pastas também não pareçam vazias, se, por exemplo, eu excluir o último arquivo de uma pasta.
Responder1
Tentei alguns casos e parece que funciona conforme necessário:
Script de shell, usr/bin/perl
, passe a entrada as arguments
.
use File::Find;
find({ wanted => \&find_files, no_chdir => 1 }, @ARGV);
sub find_files
{
if (-f $_)
{
($file) = $_ =~ /.*\/(.*)$/;
push (@all_files, $_) if ($file ne ".DS_Store");
}
else
{
push (@all_folders, $_);
}
}
sub osascript($) { system 'osascript', map { ('-e', $_) } split(/\r/, $_[0]); }
foreach(@all_files)
{
@paths = split(/\//, $_);
for $i (0..$#paths-1)
{
if ($i == 0)
{
$x = "$paths[$i]";
}
else
{
$x = "$last[$i-1]/$paths[$i]";
}
push(@last, $x);
$temp{$x} ++;
}
@last = ();
}
@not_gray_folders = keys %temp;
foreach(@all_folders)
{
$folder = $_; $flag = 0;
foreach(@not_gray_folders)
{
if ($folder eq $_)
{
$flag = 1;
}
}
if (!$flag)
{
$label = 7;
}
else
{
$label = 0;
}
&osascript ("tell application \"Finder\" to set label index of alias POSIX file \"$folder\" to $label");
}