Linux 递归地用下划线替换所有目录的句点和除最后一个句点之外的所有文件

Linux recursively replace periods for all directorys and all but last period for files with underscores

我有以下命令递归地将所有 files/directory 重命名为小写并用 _ 替换空格。

find . -iname "*" |  rename 'y/A-Z/a-z/; s/ /_/g;'

如何扩展它以从目录中删除所有句点并只为文件保留最后一个句点?

所以输入是: this.is.a.directory this.is.a.file.txt

输出 this_is_a_directory this_is_a_file.txt

您可以在 while 循环中使用 find 并使用正则表达式为文件保留最后 DOT 来执行此操作:

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)

s/\.(?=.*\.)/_/g 只有在输入中前面有另一个点时才会替换一个点。