copiando e trabalhando em arquivos .app do OSX (pastas) no linux

1

tldr;

Eu quero executar um script sobre um disco rígido externo e tar.gz cada pasta que termina com .app em seu próprio arquivo. Ou seja, não quero todos em um arquivo tar.gz, quero criar um para cada pasta.

Eu posso gerar uma lista de pastas para serem trabalhadas via:

find /Volumes/External1 *.app -prune -print

Gostaria agora de comprimir cada um deles no seu próprio arquivo.

Uma segunda parte disso é que eu gostaria de copiar todos esses arquivos e todos os outros arquivos da unidade, incluindo o arquivo, mas não as pastas com as quais eles se relacionam, e copiá-los para outro local.

mais informações

Eu criei uma caixa de ataque Linux para atuar como um servidor de arquivos para a minha rede. Eu principalmente tenho dispositivos Apple e Linux, embora a caixa de janelas ocasional se conecte.

O problema que tenho tido é que os arquivos .app do OSX são na verdade uma pasta, e tem uma estrutura subjacente complicada.

Eu colecionei todas as unidades da minha rede e as copiei para o servidor de arquivos. Eu geralmente executo um hash MD5 sobre eles na caixa OSX, e então no linux eu usarei o MD5DEEP para confirmar os hashes.

O problema real é que as contagens de diretório e os tamanhos de arquivo quase nunca se alinham ao lidar com pastas .app. Tudo o mais está em harmonia, exceto quando chega a uma dessas pastas.

O que eu estou tentando fazer agora, em um esforço para simplificar tudo, é criar um arquivo tar.gz de cada pasta .app e deixá-los em sua localização atual (ou seja, co-localizada com a pasta .app) e eu Vou armazenar o arquivo tar em vez da pasta .app. Desta forma, é um único arquivo, fácil de hash, copiar, re-hash.

Eu finalmente trabalhei em uma lista de arquivos com os quais quero trabalhar, os quais posso gerar com:

find /Volumes/External1 -name *.app -prune -print 

dois passos finais

1. crie o arquivo

Este é meu primeiro ponto de discórdia: não quero criar um único arquivo de todas essas pastas. Eu quero um arquivo para cada pasta. Então, expandindo a partir da lista gerada, como faço para empurrar a lista para arquivos criados individualmente?

2. movendo tudo da unidade

A unidade está formatada no formato Mac OSX (Journaled), portanto, moverei esses arquivos em uma rede gigabit e não conectarei a unidade externa na caixa linux (estou ciente de que há uma maneira / hack para transformar o registro em diário sem fazer isso, faço a cópia e a ligo de novo, mas não tenho conhecimento das implicações de fazê-lo e, como resultado, prefiro não fazer isso. Fico feliz em deixá-lo funcionar da noite para o dia).

Quando eu gero o comando copy (eu poderia fazer isso a partir de um terminal nas duas extremidades), eu basicamente gostaria de combinar uma linha de comando que copia:

  • arquivos e pastas na unidade de qualquer tipo, exceto
  • as pastas têm nomes terminados em ".app"
  • não é um arquivo ou pasta localizado dentro dessa pasta
  • e para ter certeza de incluir o arquivo

Para esse fim, eu propus:

find /Volumes/External1/ | grep -v '.app/'

com as quais posso trabalhar diretamente ou enviá-lo para um arquivo e trabalhar com essa lista. Eu suponho que uma lista de arquivos é melhor, porque me fornece algum nível de "estes são o que eu trabalhei"

meu pensamento

  • gera uma lista de arquivos de todas as pastas .app (lista 1)

    find /Volumes/External1/ -name *.app -prune -print > files.apps.list

  • execute um script que comprime cada pasta na lista 1 para um arquivo (deixando a pasta original intacta)

    sua ajuda agradece

  • gera uma segunda lista de arquivos, excluindo pastas .app (lista 2)

    find /Volumes/External1/ | grep -v '.app/' > files.noapps.list

  • execute um script na lista 2 que move cada arquivo pela rede

    sua ajuda novamente, obrigado

Estou pensando que ambas as etapas estendem a lista find que posso gerar em -exec cada etapa com tar e cp , mas agora estou perdida em como colocá-las juntas.

Agradeço antecipadamente

    
por Madivad 16.11.2015 / 15:13

1 resposta

0

Tem find executando o arquivador.

find /Volumes/External1/ -name *.app -prune -exec script_to_archive_and_move {} \;

em que script_to_archive_and_move é um executável que usa um .app como argumento, arquiva-o e move o arquivo para seu destino final. Com essa abordagem, você não precisa do segundo comando find .

    
por 16.11.2015 / 15:30