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

时间:2013-11-22 21:07:38

标签: python linux bash console batch-rename

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

尝试这样做:

rename 's/(\d{2})-(\d{6})\.jpg/abc-$2-$1.jpg/' *.jpg

warning http://pix.toile-libre.org/upload/original/1377510865.png 还有其他同名工具可能会或可能不会这样做,所以要小心。

如果您运行以下命令(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命令的路径。


如果您没有此命令,请搜索您的包管理器进行安装或do it manually


最后但同样重要的是,这个工具最初是由Perl的父亲Larry Wall编写的。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分: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