Qual é a maneira mais inteligente de copiar-renomear (backup) vários arquivos em diferentes pastas de uma só vez no shell?

0

Eu quero copiar-backup de vários arquivos na pasta diferente ao mesmo tempo antes de atualizar o ntpd.

Exemplo (apenas um arquivo): sudo cp /usr/sbin/ntpd /usr/sbin/ntpd.old

Arquivos:

/usr/bin/sntp  
/usr/bin/ntp-keygen  
/usr/bin/ntpq  
/usr/sbin/ntpdc  
/usr/sbin/ntpdate  
/usr/sbin/ntpd

Resultado desejado:

/usr/bin/sntp  
/usr/bin/sntp.old 
/usr/bin/ntp-keygen   
/usr/bin/ntp-keygen.old  
/usr/bin/ntpq  
/usr/bin/ntpq.old  
/usr/sbin/ntpdc  
/usr/sbin/ntpdc.old  
/usr/sbin/ntpdate  
/usr/sbin/ntpdate.old  
/usr/sbin/ntpd
/usr/sbin/ntpd.old

Existe um one-liner inteligente para realizar essa tarefa?

    
por klanomath 24.12.2014 / 13:01

2 respostas

1

Use xargs :

cat filelist | xargs -I {} cp {} {}.old
    
por 24.12.2014 / 13:22
1

Usando um loop de shell

Algo parecido com um loop simples, iterando em dois diretórios e depois combinando arquivos:

for dir in /usr/bin /usr/sbin; do
  for file in "$dir/"*ntp*; do 
    sudo cp "$dir/$file" "$dir/$file.old"
  done 
done

Isso copiará todos os arquivos correspondentes ao padrão *ntp* nos dois diretórios para o mesmo nome de arquivo, com .old anexado.

Certifique-se de citar as variáveis corretamente como uma proteção contra arquivos com espaços em branco em seus nomes. O padrão *ntp* não deve ser citado para que possa ser expandido.

Usando find

Você pode usar find e -exec também:

find /usr/bin /usr/sbin -type f -iname '*ntp*' -exec sudo cp {} {}.old \;

O que precede seria mais seguro, uma vez que só é executado em arquivos - mas você não está esperando ter diretórios chamados ntp , então tudo bem, suponho.

    
por 24.12.2014 / 13:31