将文件名中的“*”替换为“全部”

将文件名中的“*”替换为“全部”

使用Unix

Linux tinaroo1.local 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

我看到一些文件名称中带有 *

1000_*_Map_20220926182235.csv
16000_*_48_Result_Lead_20220926200445.csv

如何在一个命令中重命名所有文件以使用“全部”重命名 *

所以这些文件将变成

1000_All_Map_20220926182235.csv
16000_All_48_Result_Lead_20220926200445.csv

答案1

使用 bash shell(常见于 GNU/Linux 安装):

for file in ./*\**
do 
  [ -f "$file" ] || continue
  echo mv -- "${file}" "${file/\*/All}"
done

*这将循环遍历文件名中某处带有星号 ( ) 的文件;因为星号是 shell 的通配符,所以我们必须将其转义到我们想要的字面星号所在的位置;另外两个用于匹配星号周围的任何/所有其他字符。然后将每个匹配的文件名作为变量发送到循环中$file。循环中的第一个命令检查我们是否正在处理普通文件;我们跳过任何不是普通文件的内容。下一个命令 -- mv-- 将重命名该文件。新的文件名是使用 bash 的参数扩展生成的;语法表示:替换第一个星号字符(再次转义,以匹配实际的星号)并将其替换为文本All

循环用于echo显示会发生什么;删除echo以允许重命名发生。

我做了两件事来防止奇怪的文件名:

  1. 在初始通配符(原来的*\**)前面加上./;前缀这确保每个$file文件名都以./;开头例如,./1000_All_Map_20220926182235.csv;因此,文件名不会(不能)以连字符开头,可能会导致命令将其误解mv为选项。
  2. 作为防止“选项误解”的另一层保护,我通过在提供文件名之前mv添加来表示选项结束。--

答案2

您还可以使用renameutil-linux软件包,该软件包可能已安装在您的系统上。

执行试运行:

rename -nv '*' All *

重命名文件:

rename '*' All *

请注意,要匹配的表达式中的星号必须加引号以防止 shell 扩展。表达式使用固定字符串而不是正则表达式进行匹配,因此不需要转义。

答案3

zsh答题:

autoload -Uz
zmv -n '(**/)(*[*]*.csv)' '$1${2//[*]/All}'

-n如果满意,请删除以进行空运行)。

答案4

由于这是 RHEL 7 或 CentOS 7,除了其他答案之外,还可以使用 perl 重命名实用程序。

如果没有安装

yum install prename -y

如果您只想替换*名称中包含 a 的所有文件:

prename -n 's/\*/All/' ./*

它只会对名称包含以下内容的文件进行操作*,并且-n交换机会将发生的情况发送到 stdout,而不是对文件进行操作。*对于 shell 和 perl 正则表达式来说都是一个特殊字符。我们使用单引号将其从 shell 中转义,并\在正则表达式中使其失去其特殊的正则表达式运算符含义。替代方案是's/[*]/All/'或 `'s/\Q*\E/All/'。

对结果满意后,拆下-n开关。

相关内容