Use xargs
:
cat filelist | xargs -I {} cp {} {}.old
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?
Use xargs
:
cat filelist | xargs -I {} cp {} {}.old
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.
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.