首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash中使用通配符复制多个文件

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

Stack Overflow用户
提问于 2019-11-07 16:27:15
回答 2查看 2.3K关注 0票数 0

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

代码语言:javascript
复制
cp debug.log debug_BACKUP.log
cp debug{,_BACKUP}.log

或者,用cp替换mv来重命名文件。

现在假设我们有debug1.logdebug2.log。我们希望创建名为debug1_BACKUP.logdebug2_BACKUP.log的副本。是否有一个单一的命令来实现这一点?

当我尝试以下任一项时:

代码语言:javascript
复制
cp debug*.log debug*_BACKUP.log
cp debug*{,_BACKUP}.log

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-07 16:32:11

大括号展开是关于如何在glob展开之前重写命令的shell的说明。它们不会传递给命令本身-- cp不知道是否使用了大括号扩展。因此,cp甚至不知道是否使用通配符;当您运行cp *.txt dir/时,shell在运行它之前生成一个C字符串数组,该数组对应于cp foo.txt bar.txt baz.txt dir/

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

代码语言:javascript
复制
for f in debug*.log; do
  [[ $f = *_BACKUP.log ]] && continue # skip things that are already backup files
  cp "$f" "${f%.log}_BACKUP.log"
done
票数 1
EN

Stack Overflow用户

发布于 2019-11-07 16:37:57

很少有优秀的批量重命名程序,包括基于Perl的文件重命名。您可以通过以下三个步骤实现批量复制:

  1. 将文件复制到tmp子文件夹
  2. 执行批量重命名,将文件移回当前文件夹
  3. 删除tmp文件夹
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58753096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档