热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

递归重命名文件以删除点,但保留扩展名不变

我有多个文件夹(80?),其中包含文件。一些文件名具有多个点(file.name.ext)。通过

我有多个文件夹(80?),其中包含文件。一些文件名具有多个点(file.name.ext)。通过“ find”命令递归,我可以将文件夹中的文件名从大写重命名为小写:

find . -type f -execdir rename 'y/A-Z/a-z/' {} \;

“找到”的地方。表示搜索当前文件夹。其中“ type f”仅搜索文件。 “ execdir”在输出上执行后续命令的地方。

要执行相同的操作(大写到小写),但是对于文件夹,这两个功能都可以起作用:

rename 'y/A-Z/a-z/' *
rename 'y/A-Z/a-z/' ./*

要从文件夹名称中删除点,可以使用:

find . -maxdepth 1 -execdir sed 's/[.]/_/g' {} \;

编辑:(实际上这对我现在不起作用)

...

失败 是当我尝试递归删除点时:

find . -type f -execdir rename 's/\.(?=[^.]*\.)/_/g' '{}' \;

我得到了错误:

Can't rename ./filename.ext _/filename.ext: No such file or directory

我还尝试添加-printf“%f \ n”来删除开头的./:

find . -type f -printf "%f\n" -execdir rename 's|[.]|_|g; s|_([^_]*)$|.$1|' {} \;

输出文件名,后跟相同的错误

file.name.ext
Can't rename ./file.name.ext _/file.name.ext: No such file or directory

上面的这些命令是从包含文件的80个文件夹上方的父文件夹中运行的,其想法是一次对80个文件夹中的所有文件进行一次dryrun(重命名-nono)。

从这80个文件夹中的一个文件夹中,我可以使用以下命令从文件名中删除点,使扩展名中的点保持不变:

rename 's/\.(?=[^.]*\.)/_/g'

但是我不想进入许多文件夹中的每一个来运行命令。递归删除所有点而仅保留扩展点不起作用的方法是什么?



我在这里找到了答案:
Linux recursively replace periods for all directorys and all but last period for files with underscores

起初我不认为它可以回答我的特定问题,但实际上可以。

while IFS= read -rd '' entry; do
entry="${entry#./}" # strip ./
if [[ -d $entry ]]; then
rename 'y/A-Z/a-z/; s/ /_/g; s/\./_/g' "$entry"
else
rename 'y/A-Z/a-z/; s/ /_/g; s/\.(?=.*\.)/_/g' "$entry"
fi
done <<(find . -iname '*' -print0)

感谢anubhava。


推荐阅读
author-avatar
mobiledu2502859367
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有