使用bash重命名带有空格和正则表达式的文件

使用bash重命名带有空格和正则表达式的文件,bash,file-rename,Bash,File Rename,如果我有一个带空格的文件名和一组随机数字,如下所示: file name1234.csv mv 'file name'*'.csv file_name_${date}.csv 我想将其重命名为此(假设之前指定了日期): 我可以这样做: file name1234.csv mv 'file name'*'.csv file_name_${date}.csv 但是,在“文件名*.csv”实际上可以匹配多个文件的情况下,我想指定它为“文件名[随机数].csv” 我四处搜索,找不到任何相关的答案

如果我有一个带空格的文件名和一组随机数字,如下所示:

file name1234.csv
mv 'file name'*'.csv file_name_${date}.csv
我想将其重命名为此(假设之前指定了日期):

我可以这样做:

file name1234.csv
mv 'file name'*'.csv file_name_${date}.csv
但是,在“文件名*.csv”实际上可以匹配多个文件的情况下,我想指定它为“文件名[随机数].csv”

我四处搜索,找不到任何相关的答案

使用扩展全局变量和参数展开 您可以使用Bash和其他一些工具来做您想做的事情,而无需求助于外部或非标准实用程序

date="2016-11-21"

shopt -s extglob
for file in 'file name'+([[:digit:]]).csv; do
    newfile="${file%%[0-9]*}"
    newfile="${newfile// /_}"
    mv "$file" "${newfile}_${date}.csv"
done
您需要所谓的“路径名扩展”,以匹配一个或多个数字:

+([0-9])
一个功能脚本可以像这样:

date=$(date +'%Y-%m-%d')

shopt -s extglob nullglob

for f in 'file name'+([[:digit:]]).csv; do
    file="${f%%[0-9]*}"
    echo mv "$f" "${file// /_}_${date}.csv"
done
警告:找到的所有文件都将重命名为一个名称,请确保在删除回显之前这是您想要的名称

要激活“路径名扩展”的扩展版本,我们使用
shopt-s extglob

为了避免没有匹配文件的情况,我们还需要设置
nullglob

我们可以将位置参数设置为上述展开的结果。
然后,我们循环查找所有文件,以更改每个文件的名称。
${f%%[0-9]*}
删除从数字到结尾的所有内容。
${file///}
将空格替换为下划线。
由于
echo
的缘故,
mv
实际上并没有使用显示的脚本完成


如果在运行测试后,您希望执行更改,请删除
echo

是否可以使用
find
以类似
文件名\d+\.csv
的模式执行正则表达式搜索?当
文件名'*'.csv
匹配多个文件时,您可能希望以不同的方式处理此问题。