Applescript - como posso selecionar todas as pastas * não * em uma janela de exibição de lista expandida?

1

Estou tentando escrever um script que seleciona todas as não pastas em uma determinada janela do Finder, que está na Exibição em lista e revelou / expandiu todas as subpastas (veja a imagem).

Como costuma haver muito mais arquivos do que pastas, meu pensamento é:

  1. Selecionar todos os itens
  2. Desmarque todas as pastas

Também estou disposto a começar com nada selecionado e adicionar não pastas à minha seleção.

De qualquer forma, estou perplexo. Qualquer ajuda seria apreciada.

O resultado desejado seria semelhante a este:

insira a descrição da imagem aqui

EDIT: (para responder ao problema xy - vai demorar, mas você pediu)

Eu reparo computadores para sobreviver, o que significa que faço muitos "Backup de dados, apago o disco rígido, instalo o SO, restauro dados" o tempo todo. Tanto no Windows quanto no Mac, embora eu faça todos os backups no meu Mac, os dados do cliente são restaurados de um volume do Mac pela rede.

Normalmente, apenas arrasto pastas inteiras do volume de backup para o PC Windows restaurado e espero que ele termine. Às vezes, porém, a cópia falha, geralmente porque "o nome do caminho é muito longo" ou algo parecido. Nesses casos, acabo copiando pequenos pedaços de cada vez até terminar.

Então eu tenho que verificar e verificar se não perdi nenhum arquivo / pasta. Então, abro duas janelas, uma com a pasta de origem e a outra com a pasta de destino. E comparo pastas (músicas, documentos, etc.) de cada uma. Olho para ver se o número de arquivos / pastas corresponde e se a quantidade de bytes usados ​​é a mesma.

Freqüentemente, por causa do .DS_Store nas pastas do Mac, os bytes não correspondem. Se eu abrir a pasta e Get Summary Infoapenas o conteúdo, a contagem de bytes corresponderá perfeitamente.

Portanto, em vez de abrir dezenas ou centenas de pastas e subpastas, uma a uma, o que eu faço é abrir a Documentspasta, por exemplo, na exibição de lista, revelar todas as subpastas (isso já posso fazer no AppleScript) e depois eu Select Alle de -selecione as pastas e, em seguida Get Summary Info.

Na minha imagem acima, eu poderia fazê-lo manualmente, é claro. Mas, em muitos casos, tenho pastas com centenas de arquivos e várias pastas de profundidade. Se eu fizer isso manualmente, demorará muito tempo e, inevitavelmente, logo antes de desmarcar as últimas 10 pastas, darei um clique errado e terei que começar tudo de novo.

É por isso que quero que um script selecione todas as não pastas.

Se houver outra solução, ótimo. Deixe-me ouvir.

Zonker.in.Geneva
fonte
Por que você deseja selecioná-los? Se você contar o problema, talvez haja uma solução melhor. Leia este problema XY.
user14492
11
esse caso de uso não precisa de uma GUI e parece mais adequado a um produto projetado para sincronizar sistemas de arquivos: rsync.
Tim B
Estou com o @TimB, você deve procurar no rsync para fazer esses backups. Se você usá-lo corretamente se / quando um backup for interrompido, ele examinará de forma inteligente os arquivos copiados com êxito, ignorá-los e essencialmente retomará o backup dos que estavam faltando. Uma coisa a observar é que, se você estiver copiando do Windows para o Mac, os dois sistemas de arquivos (NTFS e HFS +, respectivamente) armazenam os carimbos de hora de maneira diferente. Então olhe para o --modify-windowswitch ou ele pode acabar copiando tudo o tempo todo. :)
Alistair McMillan
Passei apenas 3 horas tentando fazer o rsync funcionar. Mac-> Windows usando cygwin falhou por vários motivos. O Acrosync / Win está criando duplicatas das pastas que já foram copiadas e verificadas devido a nomes de arquivos / pastas com acentos. Em suma, essa "resposta" não está ajudando muito no momento. Continuarei investigando essa ferramenta para o futuro, mas alguém poderia responder à pergunta que fiz em vez de sugerir outra coisa completamente? Se eu "selecionar tudo" na minha imagem acima antes de executar o script, existe uma maneira de colocar a seleção em uma variável que eu possa atravessar?
usar o seguinte código

Respostas:

0

Se todas as pastas estiverem gastas na exibição de lista, aqui estão duas soluções.

Primeira solução:

Este AppleScript

my deselectAllFolders()

on deselectAllFolders()
    script o
        property sel : {}
    end script
    tell application "Finder"
        set o's sel to selection as alias list
        set tc to count o's sel
        repeat with i from 1 to tc
            if class of item (item i of o's sel) is folder then set item i of o's sel to missing value
        end repeat
        set selection to aliases of o's sel -- select all items without folders
    end tell
    return "" -- to not put all files into the result (it's very slow to show an huge list in the editor )
end deselectAllFolders

Contras:

  • Todos os itens devem ser selecionados antes de executar o script.
  • Lento na enorme lista de itens.

Segunda solução:

Este AppleScript

set pScript to "from Foundation import NSFileManager, NSURL, NSDirectoryEnumerationSkipsHiddenFiles, NSURLIsDirectoryKey, NSURLIsPackageKey; from ScriptingBridge import SBApplication
def procFolder(fold):
    p = df.contentsOfDirectoryAtURL_includingPropertiesForKeys_options_error_(fold, [NSURLIsDirectoryKey, NSURLIsPackageKey], NSDirectoryEnumerationSkipsHiddenFiles, None)[0]
    for f in p:
           r=f.getResourceValue_forKey_error_(None, NSURLIsPackageKey, None)
           if r[0] and r[1]:
               allFiles.append(f)
           else:
               r=f.getResourceValue_forKey_error_(None, NSURLIsDirectoryKey, None)
               if r[0] and r[1]:
                     procFolder(f)
               else:
                     allFiles.append(f) 

allFiles = []
df=NSFileManager.defaultManager() 
finderApp = SBApplication.applicationWithBundleIdentifier_(\"com.apple.finder\")
tPath = finderApp.FinderWindows()[0].target().get()
procFolder(NSURL.URLWithString_(tPath.URL()))
finderApp.setSelection_(allFiles)"

do shell script "/usr/bin/python -c " & quoted form of pScript
  • Não há necessidade de selecionar todos os itens na exibição de lista.
  • Rápido (1,5 segundo em 8500 itens)
jackjr300
fonte
0

Infelizmente, o Finder não suporta revelar arquivos dessa maneira.

O código a seguir define 'theFiles' para os arquivos no diretório escolhido, mas 'Reverse' não suporta nenhum parâmetro. Se você já tem a janela aberta, ela seleciona os arquivos na raiz da pasta escolhida nessa janela, mas abre uma janela para todas as outras pastas recursivamente.

tell application "Finder"
  set theFiles to get every item of (entire contents of folder (choose folder)) whose kind  "Folder"
  reveal theFiles
end tell

Ainda sinto que isso é mais um problema XY .

grg
fonte
Sim, ainda não encontrei a palavra correta para usar, pois "Revelar" parece ter um significado diferente. Meu script já altera a janela frontal do Finder para Exibição em lista, seleciona todas as pastas e, em seguida, pressiona a tecla "Option-Right Arrow" para expandir todas as pastas e suas subpastas. O que me deixa perplexo é o motivo pelo qual não posso emitir "Selecionar tudo" no script, enquanto manualmente posso. Eu sinto que, se eu conseguisse fazer com que o "Selecionar Tudo" funcionasse, eu poderia salvar a seleção em uma variável e depois percorrer para remover os itens que não são da pasta. De qualquer forma, qualquer ajuda é apreciada.
usar o seguinte código
@ Zonker Oh, scripts GUI, eu nem tinha pensado nessa abordagem. Fui direto ao dicionário Finder AppleScript para tentar obter a lista de arquivos programaticamente e depois revelá-los. Eu ainda diria que AppleScript não é a abordagem correta e o Keyboard Maestro tem scripts muito melhores (GUI e programaticamente), mesmo que isso pareça um problema XY. Estou ansioso para ver uma solução alternativa.
grg