【发布时间】:2020-04-12 12:42:16
【问题描述】:
我有许多文件夹(80 个?),其中包含文件。一些文件名有多个点(file.name.ext)。随着“查找”命令的递归,我可以将文件夹中的文件名从大写重命名为小写:
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 个文件夹中的所有文件进行空运行(重命名 -nono)。
从这 80 个文件夹之一中,我可以删除文件名中的点,使扩展名中的点保持不变,使用:
rename 's/\.(?=[^.]*\.)/_/g'
但我不想进入这些文件夹中的每一个来运行命令。什么会递归删除所有点,只留下扩展点?
【问题讨论】:
-
我还没有找到问题中具体错误的解决方案,但我确实在这里找到了替代解决方案:stackoverflow.com/questions/43146061/…
标签: shell unix recursion replace rename