Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中使用通配符复制多个文件_Bash - Fatal编程技术网

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

在bash中使用通配符复制多个文件,bash,Bash,使用Ubuntu 18.04。假设我们有一个名为debug.log的文件。您可以使用以下任一命令创建名为debug\u BACKUP.log的副本: cp debug.log debug_BACKUP.log cp debug{,_BACKUP}.log 或者,用mv替换cp,以重命名文件 现在假设我们有debug1.log和debug2.log。我们希望创建名为debug1\u BACKUP.log和debug2\u BACKUP.log的副本。是否只有一个命令可以实现这一点 当我尝试以下任

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

cp debug.log debug_BACKUP.log
cp debug{,_BACKUP}.log
或者,用
mv
替换
cp
,以重命名文件

现在假设我们有
debug1.log
debug2.log
。我们希望创建名为
debug1\u BACKUP.log
debug2\u BACKUP.log
的副本。是否只有一个命令可以实现这一点

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

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

错误是
cp:target'debug*\u BACKUP.log'不是一个目录

括号扩展是用于shell的指令,说明如何在全局扩展发生之前重写命令。它们不会传递给命令本身--
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

大括号扩展是shell的一条指令,说明如何在全局扩展发生之前重写命令。它们不会传递给命令本身--
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个步骤实现批量复制:

  • 将文件复制到tmp子文件夹
  • 执行批量重命名,将文件移回当前文件夹
  • 删除tmp文件夹

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

  • 将文件复制到tmp子文件夹
  • 执行批量重命名,将文件移回当前文件夹
  • 删除tmp文件夹

  • 这有助于思考这些扩展到什么。当您运行
    cp debug{,\u BACKUP}.log
    时,shell会将其重写为
    cp debug.log debug\u BACKUP.log
    。当您运行
    cp debug*{,\u BACKUP}.log
    时,shell会将其重写为
    cp debug*\u BACKUP.log
    (然后用与该glob匹配的单个文件名列表替换
    debug*\u BACKUP.log
    )。为什么后者不起作用应该是显而易见的。考虑运行<代码> SET-X/CODE >使它变得更明显。发生的事情/为什么你看到的错误是生成的。啊,谢谢,CharlesDuffy,这是有意义的。你可能想要搜索命令<代码> MMV 和<代码> MCP 。它有助于思考这些扩展到什么。当您运行
    cp debug{,\u BACKUP}.log
    时,shell会将其重写为
    cp debug.log debug\u BACKUP.log
    。当您运行
    cp debug*{,\u BACKUP}.log
    时,shell会将其重写为
    cp debug*\u BACKUP.log
    (然后用与该glob匹配的单个文件名列表替换
    debug*\u BACKUP.log
    )。为什么后者不起作用应该是显而易见的。考虑运行<代码> SET-X/CODE >使它变得更明显。发生的事情/为什么你看到的错误是生成的。啊,谢谢,CharlesDuffy,这是有意义的。你可能要搜索命令<代码> MMV 和<代码> MCP < /代码>好技巧!rename的/before/after/g'*是批量重命名的好方法。所以总共有3个命令-复制,重命名,移动到原来的相同的技巧!rename的/before/after/g'*是批量重命名的好方法。所以总共有3个命令-复制、重命名、移动到与原件相同的位置