【问题标题】:Recursively rename files to remove dots but leave extension unchanged递归重命名文件以删除点但保持扩展名不变
【发布时间】: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'

但我不想进入这些文件夹中的每一个来运行命令。什么会递归删除所有点,只留下扩展点?

【问题讨论】:

标签: shell unix recursion replace rename


【解决方案1】:

我在这里找到了答案: 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)

感谢阿努巴瓦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 2019-01-06
    • 2011-01-11
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2020-03-25
    相关资源
    最近更新 更多