Tenho algo bastante simples que quero fazer. Quero usar montage
em um diretório que contém milhares de imagens, com muito poucas opções, a saber:
me@home$ montage -size 256x256 DSC01*.JPG.svg output.png
... mas isso não é bom o suficiente, pois captura apenas cerca de 100 imagens por vez; Nem é
me@home$ montage -size 256x256 *.svg output.png
... que captura todas as imagens ao mesmo tempo, pois o arquivo resultante é muito grande para ser analisado.
O que eu quero fazer é iterar sobre algo como 100-200 arquivos por vez. Eu acho que isso poderia ser implementado usando um loop for (?), Mas estou um pouco confuso sobre como fazer isso. Acho que provavelmente existe uma maneira inteligente de usar find -exec
ou em xargs
que não estou pensando. Estou usando bash
, mas uso zsh
ocasionalmente.
Então, em conclusão, estou procurando um liner que, com 2600 arquivos de imagem, chame a montagem cerca de 13 ou 26 vezes (uma vez para cada 100-200 arquivos) e com n arquivos, possa ser chamado várias vezes n .
fonte
DSC0100.JPG.svg
...DSC2600.JPG.svg
?Respostas:
Um
bash
método, usando recursos especiais de matriz; provavelmente traduzível parazsh
com alguma modificação:fonte
Você pode usar xargs para isso; infelizmente, não é possível combinar -I (para inserir no meio de uma linha de comando) e -L (para limitar o número de arquivos para uma única chamada ao executável). Portanto, criei esta linha de comando como exemplo (mas cuidado com caracteres especiais nos nomes dos arquivos, eles não são suportados):
Remova o
echo
se você realmente deseja executar o comando.Ressalvas:
Atualizar:
Este é o loop for correspondente, que (espero) resolve o problema com espaços nos nomes dos arquivos:
Atualização 2: uma solução python, que deve ser imune a caracteres especiais em nomes de arquivos
fonte
ls
em um tubo para analisar sua saída, também deve alertar sobre os muitos perigos de fazê-lo com destaque e, no início, para garantir que as pessoas o vejam.*.svg
(e foi por isso que eu postei um comentário sobre a pergunta). No caso mais geral, em que você precisa lidar com todos os nomes de arquivos, seria necessário recorrer a globbing de shell e matrizes oufind -print0 | xargs -0
construções. Veja minha resposta para um exemplo do primeiro.Aqui está uma versão usando xargs que é segura para qualquer nome de arquivo, mas requer um arquivo temporário para armazenar a contagem. Ajuste o '-n 100' para ajustar quantos arquivos por montagem. Você também pode trocar o "printf" por um "find -print0", mas verifique se ele não encontra "count.temp".
fonte
Com o GNU Parallel, você pode:
É claro que é seguro para arquivos com caracteres especiais (como você normalmente pode esperar do GNU Parallel).
Instalação mínima
Se você precisar apenas de um paralelo e não tiver o 'make' instalado (talvez o sistema seja antigo ou o Microsoft Windows):
Assista ao vídeo de introdução para uma rápida introdução: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 ou em http://tinyogg.com/watch/TORaR/ e http://tinyogg.com/watch/hfxKj /
fonte