我想重命名 cca 1000 个文件,其名称如下: 66-123123.jpg -> abc-123123-66.jpg。所以一般的文件格式是: xx-yyyyyy.jpg -> abc-yyyyyy-xx.jpg,其中 xx 和 yyyyyy 是数字,abc 是字符串。 有人可以帮助我使用 bash 或 py 脚本吗?
尝试这样做:
rename 's/(\d{2})-(\d{6})\.jpg/abc-$2-$1.jpg/' *.jpg
如果运行以下命令(
linux
)
$ file $(readlink -f $(type -p rename))
你会得到类似
的结果.../rename: Perl script, ASCII text executable
那么这似乎是正确的工具 =)
如果没有,请将其设为
Debian
和衍生物(如 Ubuntu
)的默认值(通常已经是这种情况):
$ sudo update-alternatives --set rename /path/to/rename
(将
/path/to/rename
替换为 perl's rename
命令的路径。
如果您没有此命令,请搜索软件包管理器来安装它或手动安装。
最后但并非最不重要的一点是,这个工具最初是由 Perl 之父 Larry Wall 编写的。
for file in ??-??????.jpg ; do
[[ $file =~ (..)-(......)\.jpg ]]
mv "$file" "abc-${BASH_REMATCH[2]}-${BASH_REMATCH[1]}.jpg" ;
done
这需要 bash 4 来支持正则表达式。对于 POSIXy shell,这样就可以了
for f in ??-??????.jpg ; do
g=${f%.jpg} # remove the extension
a=${g%-*} # remove the trailing "-yyyyyy"
b=${g#*-} # remove the leading "xx-"
mv "$f" "abc-$b-$a.jpg" ;
done
您可以使用
rename
命令,该命令使用正则表达式重命名多个文件。在这种情况下,你想写
rename 's/(\d\d)-(\d\d\d\d\d\d)/abc-$2-$1/' *
其中,
\d
表示数字,$1
和$2
表示第一个和第二个括号匹配的值。
能够轻松地完成这样的事情,就是我这样命名文件的原因。使用 + 号可以让我将它们全部切割成变量,然后我可以使用 echo 重新排列它们。
#!/usr/bin/env bash
set -x
find *.jpg -type f | while read files
do
newname=$(echo "${files}" | sed s'@-@+@'g | sed s'@\.jpg@+.jpg@'g)
field1=$(echo "${newname}" | cut -d'+' -f1)
field2=$(echo "${newname}" | cut -d'+' -f2)
field3=$(echo "${newname}" | cut -d'+' -f3)
finalname=$(echo "abc-${field2}-${field1}.${field3}")
mv "${files}" "${finalname}"
done
您可以将 python 与标准库一起使用:
from pathlib import Path
from os import walk
from re import sub
Path
类将处理文件父目录、扩展名。
walk
可用于遍历路径树。
并且 sub
将负责字符串替换。
以下两行代码执行以下操作:
-
符号,但用于分隔扩展名的点除外;-
的符号替换为 _
;_
-s。f = lambda s: sub( r"_$", "", sub( r"_+", "_", sub(r"[^\w\d_-]", "_", sub( r"\.", "-", s))))
list(map( lambda p: print(p1:=p.parent/(f(p.stem) + p.suffix)) or p.rename(p1), sum( ( [ Path(r)/x for x in ds + fs ] for r, ds, fs in walk(".", topdown=False)), [] )) )