使用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
以允许重命名发生。
我做了两件事来防止奇怪的文件名:
- 在初始通配符(原来的
*\**
)前面加上./
;前缀这确保每个$file
文件名都以./
;开头例如,./1000_All_Map_20220926182235.csv
;因此,文件名不会(不能)以连字符开头,可能会导致命令将其误解mv
为选项。 - 作为防止“选项误解”的另一层保护,我通过在提供文件名之前
mv
添加来表示选项结束。--
答案2
您还可以使用rename
该util-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
开关。