Linux 通过删除字母从shell重命名文件
我有很多jpg文件,名字里有字母和数字。我想删除所有字母,例如Linux 通过删除字母从shell重命名文件,linux,shell,Linux,Shell,我有很多jpg文件,名字里有字母和数字。我想删除所有字母,例如abc12d34efg.jpg变成1234.jpg。对于For循环,我认为: for i in *.jpg; do mv "$i" ... 但是我找不到我想要的命令。这里有一个使用tr for f in *.jpg ; do n="$(echo ${f} | tr -d a-zA-Z )" ; mv "$f" "${n}jpg" ; done 加上一些格式,它看起来像 for f in *.jpg ; do n="$
abc12d34efg.jpg
变成1234.jpg
。对于For循环,我认为:
for i in *.jpg; do mv "$i" ...
但是我找不到我想要的命令。这里有一个使用
tr
for f in *.jpg ; do n="$(echo ${f} | tr -d a-zA-Z )" ; mv "$f" "${n}jpg" ; done
加上一些格式,它看起来像
for f in *.jpg ; do
n="$(echo ${f} | tr -d a-zA-Z )"
mv "$f" "${n}jpg"
done
下面是正在发生的事情:
首先,我们使用tr-da-zA-Z
删除名称中的所有字母。从abc12d34efg.jpg
中,我们得到1234.
(末尾的点为
不属于a-z
和a-z
区间)并将该值赋给变量$n
。T
然后我们可以将$f
重命名为${n}jpg
。就这样
更新要同时删除小写和大写字母,请使用
tr-da-zA-Z
,要仅删除小写字母,请使用tr-da-Z
。这里是一个使用tr
的单线解决方案
for f in *.jpg ; do n="$(echo ${f} | tr -d a-zA-Z )" ; mv "$f" "${n}jpg" ; done
加上一些格式,它看起来像
for f in *.jpg ; do
n="$(echo ${f} | tr -d a-zA-Z )"
mv "$f" "${n}jpg"
done
下面是正在发生的事情:
首先,我们使用tr-da-zA-Z
删除名称中的所有字母。从abc12d34efg.jpg
中,我们得到1234.
(末尾的点为
不属于a-z
和a-z
区间)并将该值赋给变量$n
。T
然后我们可以将$f
重命名为${n}jpg
。就这样
更新若要删除小写和大写字母,请使用
tr-da-zA-Z
,若要仅删除小写字母,请使用tr-da-Z
。使用shell参数展开:
for fname in *.jpg; do mv "$fname" "${fname//[[:alpha:]]}jpg"; done
“${fname//[:alpha:][]}”
是对所有出现的[[:alpha:][]
(任何字母)的替换,不带任何内容。因为这也会删除jpg
,所以我们必须再次添加它–附加的jpg
会这样做。使用shell参数展开:
for fname in *.jpg; do mv "$fname" "${fname//[[:alpha:]]}jpg"; done
“${fname//[:alpha:][]}”
是对所有出现的[[:alpha:][]
(任何字母)的替换,不带任何内容。因为这也会删除jpg
,所以我们必须再次添加它–附加的jpg
会这样做。您可以使用sed使用regex将所有字母替换为零
for i in *.jpg; do mv $i `echo $i | sed -e 's/[a-zA-Z]//g'`jpg; done
您可以使用sed使用regex将所有字母替换为零
for i in *.jpg; do mv $i `echo $i | sed -e 's/[a-zA-Z]//g'`jpg; done
非常感谢。它的工作,但我不得不执行另一个循环的大写字母,无论如何非常好的解释@druido82欢迎使用堆栈溢出。如果答案解决了您的问题,欢迎您通过勾选答案旁边的复选标记来接受。谢谢!它的工作,但我不得不执行另一个循环的大写字母,无论如何非常好的解释@druido82欢迎使用堆栈溢出。如果某个答案解决了您的问题,欢迎您通过勾选答案旁边的复选标记来接受该答案。有点离题,但可能有用:有一个名为mmv的命令,用于实现您的目标,不会有数据丢失的风险。有点离题,但可能有用:有一个名为mmv的命令,用于实现您的目标,没有数据丢失的风险。如果文件名包含空格将失败如果文件名包含空格将失败