Regex 在linux目录中重命名文件的最佳过程

Regex 在linux目录中重命名文件的最佳过程,regex,linux,file-rename,sed,Regex,Linux,File Rename,Sed,此问题涉及在Linux系统上重命名目录中的文件,其中受影响的文件以以下常规格式显示: index.html?p=155 index.html?page_id=10 index.html?author=2&paged=5 index.html?feed=rss2&tag=search-engine index.html?tag=social-media 是否有一个shell级别的“rename”命令,我可以使用它将目录中每个文件中的问号(?)替换为下划线(_) 提前感谢您提供的任

此问题涉及在Linux系统上重命名目录中的文件,其中受影响的文件以以下常规格式显示:

index.html?p=155
index.html?page_id=10
index.html?author=2&paged=5
index.html?feed=rss2&tag=search-engine
index.html?tag=social-media
是否有一个shell级别的“rename”命令,我可以使用它将目录中每个文件中的问号(?)替换为下划线(_)

提前感谢您提供的任何建议或信息

for file in index.html\?*; do
  new=${file/\?/_} # Substitute underscore for ?
  mv "$file" "$new" # Rename the file
done

有关使用的替换语法的信息,请参阅的参数展开部分。

您可以使用rename命令

rename '?' '_' *
第一个参数是要替换的表达式,第二个参数是要替换第一个参数的字符串,最后一个选项是选择要应用它的文件(在本例中,所有文件都在当前目录中)

有关更多详细信息,请参阅。

我更喜欢自己使用该命令,尽管有时滚动自己的循环可能更有针对性

注意:
rename
将表达式作为要更改的参数,将文件名作为最后一个参数。正确的使用方法是:

rename 's/\?/_/' index*
因为
在未转义
\
时指示前面字符的0或1

这也更容易放入可以递归操作的
find
命令中,等等:

find . -name index.html* -exec rename 's/\?/_/' {} +

感谢您在我尝试的那一刻提供了非常好的回复!更重要的是,感谢您提供了我注意到的一些附加信息,以便我能够继续了解有关如何在将来更有效地使用重命名功能的更多信息。再次感谢,我真的非常感谢!不客气:)我需要阅读更多关于
find
的内容,不过,这些封面下还有更多内容……嗨!我将存储此代码,并可能在将来使用它。使用rename命令的解决方案被证明是我正在寻找的短期解决方案,但您提供的解决方案似乎具有一些极好的长期价值。感谢您抽出时间回答我的问题,我非常感谢!