bach linux 文件重命名 - 如何在 Linux 控制台中重命名多个文件

问题描述 投票:0回答:5

我想重命名 cca 1000 个文件,其名称如下: 66-123123.jpg -> abc-123123-66.jpg。所以一般的文件格式是: xx-yyyyyy.jpg -> abc-yyyyyy-xx.jpg,其中 xx 和 yyyyyy 是数字,abc 是字符串。 有人可以帮助我使用 bash 或 py 脚本吗?

python linux bash console batch-rename
5个回答
1
投票

尝试这样做:

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 编写的。


1
投票
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

0
投票

您可以使用

rename
命令,该命令使用正则表达式重命名多个文件。在这种情况下,你想写

rename 's/(\d\d)-(\d\d\d\d\d\d)/abc-$2-$1/' *

其中,

\d
表示数字,
$1
$2
表示第一个和第二个括号匹配的值。


0
投票

能够轻松地完成这样的事情,就是我这样命名文件的原因。使用 + 号可以让我将它们全部切割成变量,然后我可以使用 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

0
投票

您可以将 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)), [] )) )
© www.soinside.com 2019 - 2024. All rights reserved.