我在 Linux 上,我的文件如下所示:
10154-person134_bacteria_640.jpeg
10163-NORMAL2-IM-0141-0001.jpeg
10175-person147_bacteria_707.jpeg
2555-person1_virus_12.jpeg
25562-person132_bacteria_632.jpeg
25566-person143_bacteria_687.jpeg
我需要它们看起来像这样:
10154.jpeg
10163.jpeg
10175.jpeg
2555.jpeg
25562.jpeg
25566.jpeg
我尝试了 awk 但遇到了问题。
答案1
如果您已经安装perl-rename
(在许多系统上安装rename
,包括 Debian 和 Ubuntu),您可以执行以下操作:
$ rename -n 's/(.+?)-.*\./$1./' *jpeg
10154-person134_bacteria_640.jpeg -> 10154.jpeg
10163-NORMAL2-IM-0141-0001.jpeg -> 10163.jpeg
10175-person147_bacteria_707.jpeg -> 10175.jpeg
2555-person1_virus_12.jpeg -> 2555.jpeg
25562-person132_bacteria_632.jpeg -> 25562.jpeg
25566-person143_bacteria_687.jpeg -> 25566.jpeg
如果显示了您期望的输出,请再次运行该命令,而无需-n
实际重命名文件。
或者,您可以在 shell 中执行此操作:
$ for file in *jpeg; do echo mv -- "$file" "${file%%-*}.jpeg"; done
mv -- 10154-person134_bacteria_640.jpeg 10154.jpeg
mv -- 10163-NORMAL2-IM-0141-0001.jpeg 10163.jpeg
mv -- 10175-person147_bacteria_707.jpeg 10175.jpeg
mv -- 2555-person1_virus_12.jpeg 2555.jpeg
mv -- 25562-person132_bacteria_632.jpeg 25562.jpeg
mv -- 25566-person143_bacteria_687.jpeg 25566.jpeg
同样,如果打印出您期望的内容,请运行该命令,而无需echo
实际重命名文件。
答案2
如果您没有安装重命名实用程序,您可以自行安装
perl -e 'rename $_, s/-.*\././r for @ARGV' ./*.jpeg
或者,使用 GNU 版本的 sed 和 xargs 工具,在其中添加空字节后缀\0
以缓解文件名问题。
printf '%s\0' *.jpeg |
sed -ze 'p;s/-.*\././' |
xargs -r0 -n2 -t mv --
答案3
或者如果你想使用 awk,那么
#!/bin/sh
files="10154-person134_bacteria_640.jpeg
10163-NORMAL2-IM-0141-0001.jpeg
10175-person147_bacteria_707.jpeg
2555-person1_virus_12.jpeg
25562-person132_bacteria_632.jpeg
25566-person143_bacteria_687.jpeg"
for f in $files; do
name=`echo $f | awk -F- '{print $1}'`
echo $name.jpeg
done