Como coletar todos os arquivos de mídia em uma estrutura de diretórios mac?

0

Estou tentando copiar todos os arquivos de mídia (tipo de arquivo Mac de Imagem ou Filme) para a mesma estrutura de diretórios, usando apenas arquivos de mídia.

  1. Existe uma maneira mais eficiente do que eu tenho abaixo?
  2. Existe um mecanismo no Mac OS para obter o tipo de imagem ou filme?
  3. Isso pode ser feito sem um arquivo tar intermediário? (suponha 100.000 arquivos de mídia)

A ideia é:

  1. Cria uma lista de arquivos temporários de arquivos de mídia (o tar não pode levar muitos arquivos na linha de comando)
  2. Criar arquivo tar
  3. Extrair arquivo tar

Obrigado por qualquer conselho.

# $1 is the directory to search for media
# $2 is the output file name
media_list() {
  find $1 -type f \( -iname "*.JPG" -o -iname "*.JPEG" -o -iname "*.NREF" -o -iname "*.TIFF" -o -iname "*.wmv" -o -iname "*.MOV" -o -iname "*.mp4" -o -iname "*.MPG" -o -iname "*.AVI" -o -iname "*.3g2" -o -iname "*.3gp" -o -iname "*.m4v" \) > $2
}

# $1 is the directory to get media
# $2 is the output tar file name
tar_media() {
  rm file-list.txt
  media_list $1 file-list.txt
  tar -cv -f $2 -I file-list.txt 
}
    
por justingordon 16.06.2013 / 01:57

1 resposta

1

Diferentes opções:

mdfind -onlyin . 'kMDItemContentTypeTree=public.movie||kMDItemContentTypeTree=public.image' | parallel cp {} /tmp/{/}

  • paralelo pode ser instalado com brew install parallel
  • {/} é o nome de base

find . -iname \*.mkv -o -iname \*.jpg | while IFS= read -r f; do cp "$f" /tmp/"${f%%*/}"; done

  • leia os caracteres das faixas no IFS desde o início e o fim das linhas
  • read -r desativa a interpretação de barras invertidas
  • ${f%%*/} remove o padrão */ mais longo desde o início

shopt -s globstar extglob nocaseglob; for f in **/*.@(mkv|jpg); do cp "$f" "/tmp/${f%%*/}"; done

  • globstar (adicionado no bash 4.0) faz com que ** combine vários níveis de diretórios
  • extglob adiciona suporte para @(pat1|pat2) (exatamente um)
  • nocaseglob torna globs insensíveis a maiúsculas e minúsculas

f() { cp "$1" "/tmp/${1%%*/}"; }; export -f f; gfind . -regextype posix-extended -iregex '.*\.(mkv|jpg)' -print0 | xargs -0 -n1 bash -c 'f "$1"' _

  • O find do OS X não suporta regex estendida, então o comando usa o GNU find
  • export -f e bash -c são necessários para executar a função com xargs
  • xargs -n1 recebe um argumento de cada vez
por 16.06.2013 / 19:44