Я хочу скопировать и сделать резервные копии нескольких файлов одновременно в другой папке перед обновлением ntpd.

Пример (только один файл): sudo cp /usr/sbin/ntpd /usr/sbin/ntpd.old

файлы:

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

Желаемый результат:

/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

Существует ли умный однострочник для выполнения этой задачи?

2 ответа2

1

Используйте xargs:

cat filelist | xargs -I {} cp {} {}.old
1

Использование цикла оболочки

Что-то вроде простого цикла, итерация по двум каталогам, а затем сопоставление файлов:

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

Это скопирует все файлы, соответствующие шаблону *ntp* в обоих каталогах, в одно и то же имя файла с добавлением .old .

Убедитесь, что правильно указали переменные в качестве защиты от файлов с пробелами в их имени. Шаблон *ntp* не должен заключаться в кавычки, чтобы его можно было расширить.

Используя find

Вы также можете использовать find и -exec :

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

Вышеприведенное было бы безопаснее, поскольку оно работает только с файлами - но вы не ожидаете, что у вас будут каталоги с именем ntp , так что это нормально, я полагаю.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .