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

标签 regex linux file rename period

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

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

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

所以输入是: 这是一个目录 这是一个文件.txt

输出 这是一个目录 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 只会在输入中前面有另一个点时替换一个点。

关于regex - Linux递归地用下划线替换所有目录的句点和除最后一个句点之外的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43146061/

相关文章:

Java 正则表达式 : Two different strings, 第一次未正确分割

linux - 如何在 am335x evm 中的 NAND 闪存中创建分区?

c# - 使用 xamarin 从现有 wpf 程序创建 Linux 应用程序

file - Node : How to wait until a file is completed before processing it?

c++ - 将文本和行添加到文件的开头

java - 我怎样才能以更聪明的方式做到这一点而不发生冲突?

java - 正则表达式问题 - 引号内的文本 block 之外的一个或多个空格

regex - 从大文件 (~1G) 中删除模式

c - 使用 fwrite() 在 C 中逐字节写入文件

c - 如何使用 Windows API 创建文件?