我想批量重命名目录中的一些文件,以便从文件名中去除前面的数字和henn。
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 * – 在curent文件夹中列出文件
sed -e – 执行表达式
磷; – 打印旧的文件名称
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 --regex --find '\d+-(.*)' --replace '$1' *
这将从当前目录中的所有文件的开始剥离所有数字和第一个连字符。
vimv让你使用Vim的文本编辑功能重命名多个文件。
进入vimv打开一个列出所有文件的Vim窗口,你可以进行模式匹配,视觉选择等来编辑名称。 在你退出Vim后,文件将被重命名。
自述文件中的屏幕截图显示了它如何解决原始海报的问题。
[免责声明:我是该工具的作者]
这可能看起来有点复杂,但是它非常有效,在* 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
)所有文件,从当前目录( .
)中的文件开始,其名称与“7个数字的后面跟一个破折号,后跟0个或更多个字符”的模式( -regex
) '.*/[0-9]\{7\}[-].*'
),并将这些文件名和它们各自的路径( -print
)写入名为temp1 ( > temp1
)的文件。 请注意,在大多数情况下, -print
指令可能不是必需的,但它不应该伤害任何东西。
find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
然后,将temp1的内容复制( cp
)到一个名为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
)的行连接起来, 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
你可以使用这个工具: rnm
代码做你想做的事情:
rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'
-fo
仅用于文件模式
-dp
是目录的深度( -1
表示无限深度)。
-rs
是替换字符串。 \d+-
正则表达式被空字符串替换。
-ss
是搜索字符串,它使用^\d+-
regex搜索文件。 (虽然可以省略,但一些无害的错误消息将被打印在屏幕上)。
我真的很喜欢“重命名* .mp3 * .mp4”。
但没有其他答案给我这个。 所以我写了一个haskell程序来做到这一点。
https://hackage.haskell.org/package/batch-rename
有了这个你可以这样做:batch_rename“DCIM * .jpg”“* .png”
还有一个方便的GUI工具pyRenamer
https://wiki.ubuntuusers.de/pyRenamer/