我想批量重命名目录中的多个文件,以便从文件名中删除前面的数字和连字符。
Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name: XXX_01_xxxx_20130730235001_00000000.NEW
如何使用 linux 命令执行此操作?
我想批量重命名目录中的多个文件,以便从文件名中删除前面的数字和连字符。
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]
多次获取块(即数字),然后是连字符-
并将其从文件名中删除。
如果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
如果您执行以下命令,我认为此命令会更好:
ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv
这里
ls * - 列出当前文件夹中的文件
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
如果第一个数字总是相同的长度:
for F in *new ; do
mv $F ${F:8}
done
${parameter:number}
进行子字符串扩展 - 从第 8 个字符开始获取字符串。
扩展中还有许多其他字符串编辑可用于处理其他情况。
使用重命名器(Windows、Mac 和 Linux 友好):
$ renamer --find '/\d+-(.*)/' --replace '$1' *
这将从当前目录中所有文件的开头删除所有数字和第一个连字符。
这可能看起来有点复杂,但它非常有效,并且在 *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 && \
然后,将temp1cp
的内容复制 ( )到名为temp2的文件中。
cp temp1 temp2 && \
接下来,使用vi文本编辑器打开文件temp2并给 vi 两个命令(用于表示每个新命令):-c
:g
我们在上面搜索的相同模式,但这次使用括号 ( \([0-9]\{7\}[-]\)\(.*\)
) 对结果进行分组。\2
)。:x
)。结果是这样的:
vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \
现在,将temp1中的行与temp2 ( paste
) 中的行连接起来,并将每个新组合的行写入一个名为temp3 ( > temp3
) 的文件中。
paste temp1 temp2 > temp3 && \
接下来,再次运行vi,执行与上述相同的步骤,只是这次^
在文件temp3中搜索每一行的开头 ( ) 并在其后添加mv和一个空格 ( mv
)。
vi -c ":g/^/s//mv /" -c ":x" temp3 && \
然后,将temp3 ( ./temp3
) 的内容作为 shell 脚本 ( sh
) 执行。
sh ./temp3 && \
最后,删除(rm
)我们在整个过程中创建的每个临时文件。
rm temp1 temp2 temp3
还有一个方便的 GUI 工具pyRenamer
https://wiki.ubuntuusers.de/pyRenamer/
你可以使用这个工具:rnm
代码做你想做的事:
rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'
-fo
仅用于文件模式
-dp
是目录的深度(-1
意味着无限深度)。
-rs
是替换字符串。\d+-
正则表达式被替换为空字符串。
-ss
是搜索字符串,它使用正则表达式搜索文件^\d+-
。(虽然它可以省略,一些无害的错误信息会打印在屏幕上)。
我真的很喜欢“重命名 *.mp3 *.mp4”。
但是其他答案都没有给我。所以我写了一个haskell程序来做到这一点。
https://hackage.haskell.org/package/batch-rename
有了这个你可以这样做:batch_rename "DCIM*.jpg" "*.png"