在 shell 中一次复制重命名(备份)不同文件夹中的多个文件的最聪明的方法是什么?

在 shell 中一次复制重命名(备份)不同文件夹中的多个文件的最聪明的方法是什么?

我想在更新 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

是否存在一个智能的单行程序来完成这个任务?

答案1

使用xargs

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

答案2

使用 shell 循环

类似于简单的循环,遍历两个目录然后匹配文件:

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,所以我想这没问题。

相关内容