Usando parâmetros em um script

1

Eu costumo usar o comando find para copiar automaticamente certos arquivos multimídia do diretório A para o diretório B. Eu uso o seguinte comando:

for f in 'find ./ -name "*.mkv" -mtime -24h'; do cp $f rename/ ; done

Isso faz totalmente o que eu quero, mas agora que eu transferi o comando para um script executável (vamos chamá-lo de mmcopy , funciona perfeitamente). Pergunto-me se eu poderia melhorar o script para fazer o seguinte:

Quando eu digito mmcopy na linha de comando, gostaria de analisar dois operadores / variáveis para o script, ou seja, uma variável da extensão do arquivo e uma variável para o operador mtime, para que eu possa especificar que tipo de arquivos deve ser copiado e quantos anos esses arquivos podem ser.

Por exemplo: eu quero copiar automaticamente (todos) .jpg arquivos em um diretório que seja mais recente que 3 dias, a linha de comando deve parecer com mmcopy jpg -3d

Como eu teria que mudar meu roteiro para poder fazê-lo?

    
por Georg 22.03.2015 / 18:40

1 resposta

2

Primeiro, seu script atual é dividido em nomes de arquivos que contêm espaço em branco e outros caracteres especiais. É muito fácil corrigir isso: sempre use aspas duplas em torno de substituições de variáveis e use -exec em vez de analisar a saída de find . Veja Por que meu script de shell engasgar com espaço em branco ou outros caracteres especiais? para mais informações.

find . -name "*.mkv" -mtime -24h -exec cp {} rename/ \;

Argumentos passados para o seu script estão disponíveis nos parâmetros especiais $1 , $2 , etc. Aqui está um script que copia arquivos cuja extensão é o primeiro parâmetro para o script e cuja comparação de data e hora é dada pelo segundo parâmetro.

#!/bin/sh
find . -name "*.$1" -mtime "$2" -exec cp {} rename/ \;

Se você quiser assumir valores padrão se os argumentos estiverem faltando, você pode usar o ${…:-…} construção de expansão de parâmetro .

#!/bin/sh
find . -name "*.${1:-mkv}" -mtime "${2:--1d}" -exec cp {} rename/ \;

Eu recomendo substituir cp por cp -p ou rsync -a . cp -p preserva o registro de data e hora no arquivo, o que facilita saber quando você já copiou um arquivo. rsync -a adicionalmente não copia o arquivo se já foi copiado (a menos que o arquivo original tenha um carimbo de data / hora ou tamanho diferente).

    
por 22.03.2015 / 19:29