在bash中使用通配符复制多个文件

使用Ubuntu 18.04。假设我们有一个名为debug.log的文件。您可以使用以下任一命令创建名为debug_BACKUP.log的副本:

cp debug.log debug_BACKUP.log
cp debug{,_BACKUP}.log

或者,将cp替换为mv重命名文件。

现在假设我们有debug1.logdebug2.log。我们想创建名为debug1_BACKUP.logdebug2_BACKUP.log的副本。是否有单个命令可以实现这一目标?

当我尝试以下任一方法时:

cp debug*.log debug*_BACKUP.log
cp debug*{,_BACKUP}.log

错误是cp: target 'debug*_BACKUP.log' is not a directory

d228489 回答:在bash中使用通配符复制多个文件

括号扩展是外壳程序的指令,用于在全局扩展发生之前如何重写命令。它们不会传递给命令本身-cp不知道是否使用了括号扩展。因此,cp甚至都不知道是否使用了通配符;当您运行cp *.txt dir/时,shell会在运行之前生成与cp foo.txt bar.txt baz.txt dir/之类的东西对应的C字符串数组。

这意味着,如果要在通配符扩展后重写内容,则需要手工完成。

for f in debug*.log; do
  [[ $f = *_BACKUP.log ]] && continue # skip things that are already backup files
  cp "$f" "${f%.log}_BACKUP.log"
done
,

很少有出色的批量重命名程序,包括基于Perl的文件重命名。您可以通过3个步骤完成批量复制:

  1. 将文件复制到tmp子文件夹
  2. 执行批量重命名,将文件移回当前文件夹
  3. 删除tmp文件夹
本文链接:https://www.f2er.com/3143123.html

大家都在问