Linux 批量重命名文件

Linux 批量重命名文件,linux,bash,rename,file-rename,Linux,Bash,Rename,File Rename,我想批量重新命名目录中的许多文件,以便从文件名中删除前面的编号和hypen Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW New file name: XXX_01_xxxx_20130730235001_00000000.NEW 如何使用linux命令执行此操作?这应该是: rename 's/^[0-9]*-//;' * 它从一开始就多次获取块[0-9](即数字),然后使用连字符-,并将其从文

我想批量重新命名目录中的许多文件,以便从文件名中删除前面的编号和hypen

Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name:         XXX_01_xxxx_20130730235001_00000000.NEW
如何使用linux命令执行此操作?

这应该是:

rename 's/^[0-9]*-//;' *
它从一开始就多次获取块
[0-9]
(即数字),然后使用连字符
-
,并将其从文件名中删除

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

如果
rename
不在您的计算机中,您可以使用循环和
mv

mv "$f" "${f#[0-9]*-}"
试验 或:


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

for F in *new ; do
    mv $F ${F:8}
done
${parameter:number}
执行子字符串扩展-获取从第8个字符开始的字符串

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

使用(Windows、Mac和Linux友好型):


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

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

ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv
这里
ls*-列出当前文件夹中的文件
sed-e-执行表达式
p-打印旧文件名
s/旧名称/新名称/-生成新文件名
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

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

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
)所有文件,从当前目录(
)中的文件开始,这些文件的名称与模式(
-regex
)匹配,模式为“7个数字,后跟破折号,后跟0个或更多字符”(
'./[0-9]\{7\}[-].'
),并写入这些文件名及其各自的路径(
-print
)到名为temp1(
>temp1
)的文件中。请注意,在大多数情况下,
-print
指令可能不是必需的,但它不会造成任何影响

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

接下来,使用打开文件temp2并给vi两个命令(使用
-c
表示每个新命令):

  • 命令#1:
    • 在temp2的每一行(
      :g
      )中搜索我们在上面搜索的相同模式,除了这次使用括号(
      \([0-9]\{7\}[-]\)\(.\)
      )对结果进行分组之外
    • 对于每个匹配行,将光标移动到找到匹配项的位置,并将整个匹配项仅替换为第二组匹配模式(
      \2
  • 命令#2:
    • 保存对temp2所做的更改并关闭文件(
      :x
  • 其结果是:

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

    接下来,再次运行vi,执行与上面相同的步骤,只是这次搜索文件temp3中每行的开头(
    ^
    ),并在其后添加一个空格(
    mv

    然后,将temp3(
    /temp3
    )的内容作为shell脚本(
    sh
    )执行

    最后,删除(
    rm
    )我们在整个过程中创建的每个临时文件

    rm temp1 temp2 temp3
    
    您可以使用此工具:

    执行所需操作的代码:

    rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'
    
    -fo
    仅用于文件模式
    -dp
    是目录的深度(
    -1
    表示无限深度)。
    -rs
    是替换字符串。
    \d+-
    正则表达式被替换为空字符串。

    -ss
    是搜索字符串,它使用
    ^\d+-
    regex搜索文件。(虽然可以省略,但一些无害的错误消息会打印在屏幕上)。

    我非常喜欢“rename*.mp3*.mp4”之类的东西

    但是没有其他答案能给我这个答案,所以我写了一个haskell程序来实现它

    有了它,您可以:
    批量重命名“DCIM*.jpg”“*.png”

    还有一个方便的GUI工具
    pyRenamer

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

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

    自述文件中的说明如何解决原始海报的问题


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

    这不适用于我的
    重命名版本(util linux ng 2.17.2)。您使用的是什么版本?rename在Fedora和Debian发行版的util linux中,但在OSX上似乎默认不包含。@Yossarian使用
    mv
    检查我的更新答案。它对您有效吗?是的,
    mv
    命令对我有效。似乎必须有两个版本的
    rename
    -我需要三个参数s(
    从重命名为文件
    )@cjungel不确定您的意思可能重复的可以使用依赖项安装吗?我不确定您的意思..上有安装说明..这有帮助吗?节点包管理器似乎在包依赖项方面有问题,因此它没有只安装一个命令,npm也没有在自动模式下安装依赖项。我只是n
    npm安装-g renamer
    -它安装正确,工作正常..请确保您安装了最新的node.js..如果您仍然有问题,请提出一个非常有用的问题。谢谢!我看到这是旧的;但是您能分析一下发生了什么吗
     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
    
    rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'