假设我有一堆文件名为:bsdsa120226.nai bdeqa140223.nai,我想将它们重命名为120226.nai 140223.nai。我如何使用下面的脚本实现这一目标?
#!/bin/bash
name1=`ls *nai*`
names=`ls *nai*| grep -Po '(?<=.{5}).+'`
for i in $name1
do
for y in $names
do
mv $i $y
done
done
Solution:
name1=`ls *nai*`
for i in $name1
do
y=$(echo "$i" | grep -Po '(?<=.{5}).+')
mv $i $y
done
答案 0 :(得分:2)
此:
#!/bin/bash
shopt -s extglob nullglob
for file in *+([[:digit:]]).nai; do
echo mv -nv -- "$file" "${file##+([^[:digit:]])}"
done
如果您对echo
命令感到满意,请删除mv
。
注意。此解决方案 假设有5个要删除的主要字符。它将删除所有前导的非数字字符。
答案 1 :(得分:1)
只使用bash,你可以这样做:
for file in *nai* ; do
echo mv -- "$file" "${file:5}"
done
(对输出感到满意时删除echo
。)
Avoid ls
in scripts,但显示信息除外。改为使用普通的globbing。
另请参阅How do I do string manipulations in bash?了解更多字符串操作技巧。
您的脚本无法使用该结构:如果您有5个文件,它将为第一个文件调用mv
五次(对于第二个列表中的每个元素调用一次),对于第二,等等。您需要以锁步方式迭代这两组名称。 (它也不会处理文件名中的空格等内容。)
答案 2 :(得分:1)
最好在某些系统上使用rename
(prename
),因为这样可以使用Perl正则表达式进行重命名,如下所示:
prename 's/^.{5}//' *.nai
脚本不正常的原因是,对于每个源文件,您尝试将其重命名为每个目标文件
如果您需要限制自己使用该脚本,则需要为每个源文件计算单个目标文件,如:
#!/bin/bash
for i in *.nai; do
y=$(echo "$i" | cut -c6-)
mv "$i" "$y"
done
答案 3 :(得分:0)
如果您的系统有rename
工具,那么最好使用简单的rename
命令,
rename 's/^.{5}//' *.nai
它只是从文件名中删除前5个字符。
或强>
for i in *.nai; do mv "$i" $(grep -oP '(?<=^.{5}).+' <<< "$i"); done