使用 bash 重命名包含空格和正则表达式的文件
use bash to rename a file with spaces and regex
如果我有一个包含空格和一组随机数字的文件名,如下所示:
file name1234.csv
我想将它重命名为这个(假设之前指定了日期):
file_name_${date}.csv
我可以这样做:
mv 'file name'*'.csv file_name_${date}.csv
但是在'file name*.csv'其实可以匹配多个文件的情况下,我想指定为'file name[random numbers].csv'
我搜索了一圈,没有找到任何相关的答案。
使用扩展的 Glob 和参数扩展
您可以使用 Bash extended globs and a few parameter expansions 做您想做的事,而无需借助外部或非标准实用程序。
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
您需要一个 "pathname expansion" 来匹配一个或多个数字:
+([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
警告:找到的所有文件都将重命名为一个名称,在删除 echo 之前确保这是您想要的名称。
要激活 "Pathname Expansion" 的扩展版本,我们使用 shopt -s extglob
。
为了避免没有文件匹配的情况,我们还需要设置nullglob
。
我们可以将位置参数设置为上述扩展的结果。
然后我们遍历找到的所有文件以更改它们的每个名称。
${f%%[0-9]*}
删除所有数字到末尾。
${file// /_}
用下划线替换空格。
由于 echo
.
,mv
实际上并未使用提供的脚本完成
如果在 运行 测试之后,您希望执行更改,请删除 echo
。
如果我有一个包含空格和一组随机数字的文件名,如下所示:
file name1234.csv
我想将它重命名为这个(假设之前指定了日期):
file_name_${date}.csv
我可以这样做:
mv 'file name'*'.csv file_name_${date}.csv
但是在'file name*.csv'其实可以匹配多个文件的情况下,我想指定为'file name[random numbers].csv'
我搜索了一圈,没有找到任何相关的答案。
使用扩展的 Glob 和参数扩展
您可以使用 Bash extended globs and a few parameter expansions 做您想做的事,而无需借助外部或非标准实用程序。
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
您需要一个 "pathname expansion" 来匹配一个或多个数字:
+([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
警告:找到的所有文件都将重命名为一个名称,在删除 echo 之前确保这是您想要的名称。
要激活 "Pathname Expansion" 的扩展版本,我们使用 shopt -s extglob
。
为了避免没有文件匹配的情况,我们还需要设置nullglob
。
我们可以将位置参数设置为上述扩展的结果。
然后我们遍历找到的所有文件以更改它们的每个名称。
${f%%[0-9]*}
删除所有数字到末尾。
${file// /_}
用下划线替换空格。
由于 echo
.
mv
实际上并未使用提供的脚本完成
如果在 运行 测试之后,您希望执行更改,请删除 echo
。