批量重命名文件

时间:2013-09-11 13:58:33

标签: linux bash rename file-rename

我想批量重命名目录中的一些文件,以便从文件名中删除前面的数字和超文本。

Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name:         XXX_01_xxxx_20130730235001_00000000.NEW

如何使用linux命令执行此操作?

8 个答案:

答案 0 :(得分:39)

这应该成功:

rename 's/^[0-9]*-//;' *

它从块[0-9]开始(即数字)多次,然后是连字符-,并从文件名中删除它。


如果您的计算机中没有rename,您可以使用循环mv

mv "$f" "${f#[0-9]*-}"

测试

$ ls
23-aa  hello aaa23-aa
$ rename 's/^[0-9]*-//;' *
$ ls
aa  hello aaa23-aa

或者:

$ ls
23-a  aa23-a  hello
$ for f in *;
> do
>   mv "$f" "${f#[0-9]*-}"
> done
$ ls
a  aa23-a  hello

答案 1 :(得分:19)

我认为如果你执行以下命令,这个命令会更好:

ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv

这里
ls * - 列出curent文件夹中的文件
sed -e - 执行表达式
p; - 打印旧文件名
s / old-name / new-name / - 生成新文件名
xargs -n2 - 处理mv
的两个参数 mv - 获取两个参数并执行移动操作

推荐:在执行mv之前验证您要执行的操作是 echo

ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 echo

以下示例重命名

SCCF099_FG.gz5329223404623884757.tmp
SCCF099_FG.gz

ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 echo
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 mv

答案 2 :(得分:6)

如果第一个数字的长度始终相同:

for F in *new ; do
    mv $F ${F:8}
done

${parameter:number}执行子字符串扩展 - 从第8个字符开始获取字符串。

在扩展中还有许多其他字符串编辑可用于处理其他情况。

答案 3 :(得分:3)

使用renamer(Windows,Mac和Linux友好):

$ renamer --find '/\d+-(.*)/' --replace '$1' *

这将从当前目录中的所有文件的开头删除所有数字和第一个连字符。

答案 4 :(得分:1)

这可能看起来有点复杂,但它非常有效并且在* nix和OSX系统上运行良好。它还以递归方式执行,重命名当前目录中的文件以及任何子目录:

        'js' => 'all-{hash}.js',    
        'css' => 'all-{hash}.css', 

以下是对刚刚发生的事情的细分:

第一行说找到(find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \ cp temp1 temp2 && \ vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \ paste temp1 temp2 > temp3 && \ vi -c ":g/^/s//mv /" -c ":x" temp3 && \ sh ./temp3 && \ rm temp1 temp2 temp3 )所有文件,从当前目录(find)开始,其名称与&#34的模式(.)相匹配; 7个数字,后跟短划线,后跟0个或更多字符" (-regex),并将这些文件名及其各自的路径('.*/[0-9]\{7\}[-].*')写入名为 temp1 -print)的文件中。请注意,> temp1指令在大多数情况下可能不是必需的,但它不应该伤害任何东西。

-print

然后,将 temp1 的内容复制(find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \ )到名为 temp2 的文件。

cp

接下来,使用vi text editor打开文件 temp2 ,并为vi提供两个命令(使用cp temp1 temp2 && \ 表示每个新命令):

  1. 命令#1:
    • 搜索 temp2 -c)的每一行,查找我们在上面搜索的相同模式,但此时使用括号(:g)对结果进行分组。
    • 对于每个匹配的行,将光标移动到找到匹配的位置,并将整个匹配仅替换为匹配模式的第二组(\([0-9]\{7\}[-]\)\(.*\))。
  2. 命令#2:
    • 保存对 temp2 所做的更改并关闭文件(\2)。
  3. 结果如下:

    :x

    现在,将 temp1 中的行与 temp2 vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \ )的行连接起来,并将每个新组合的行写入名为 temp3 <的文件中/ em>(paste)。

    > temp3

    接下来,再次运行 vi ,执行与上述相同的步骤,但这次搜索文件 temp3 中每行(paste temp1 temp2 > temp3 && \ )的开头部分并在其后面添加mv和一个空格(^)。

    mv

    然后,执行 temp3 vi -c ":g/^/s//mv /" -c ":x" temp3 && \ )的内容作为shell脚本(./temp3)。

    sh

    最后,删除(sh ./temp3 && \ )我们在整个过程中创建的每个临时文件。

    rm

答案 5 :(得分:1)

还有一个方便的GUI工具pyRenamer https://wiki.ubuntuusers.de/pyRenamer/

答案 6 :(得分:1)

vimv允许您使用Vim的文本编辑功能重命名多个文件。

输入vimv会打开一个Vim窗口,其中列出了所有文件,您可以进行模式匹配,视觉选择等来编辑名称。退出Vim后,文件将被重命名。

README文件中的screencast显示了它如何解决原始海报的问题。

[免责声明:我是该工具的作者]

答案 7 :(得分:0)

我非常喜欢&#34;重命名* .mp3 * .mp4&#34;。

但其他答案都没有给我这个。所以我写了一个haskell程序来做它。

https://hackage.haskell.org/package/batch-rename

有了这个,你可以这样做:  batch_rename&#34; DCIM * .jpg&#34; &#34; *。PNG&#34;