作者:mobiledu2502859367 | 来源:互联网 | 2023-10-15 11:39
我有多个文件夹(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。