Linux以递归方式替换所有directorys的句点,以及除了持续下划线的文件的最后一段时间

时间:2017-03-31 17:00:21

标签: regex linux file rename period

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

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

1 个答案:

答案 0 :(得分:0)

您可以在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)
如果输入中有另一个DOT,

s/\.(?=.*\.)/_/g将仅替换DOT。