我今天在玩Bash脚本时偶然发现了Perl。当我试图删除多个文件名中的空格时,我发现了this后,这对我有很大帮助。在Bash中使用基于Perl的重命名命令
经过很多努力,我终于明白了重命名和替换命令及其语法。我想尝试在文件名末尾用“x”取代所有“_(x)”,这是由于文件重复。但是当我尝试自己做这件事时,它似乎并不奏效。我有三个问题用下面的代码:
- 为什么在我运行它时没有执行任何操作?
- 我使用重定向来显示成功注释为错误,所以我知道发生了什么。我做错了什么?
- 经过大量的研究,我仍然没有完全理解Bash中的文件描述符和重定向以及Perl中替代函数的语法。有人可以给我一个好的教程的链接?
find -name "*_(*)." -type f | \
rename 's/)././g' && \
find -name "*_(*." -type f | \
rename 's/_(//g' 2>&1
谢谢,这确实让我非常吃惊。但我仍然不明白为什么没有xargs或exec在[我提到的例子]中使用(http://stackoverflow.com/questions/2709458/bash-script-to-replace-spaces-in-file-names) 。 在那里,正则表达式之后的重命名命令足以删除文件名中的空白。 另外,如果我与exec或xargs一起工作,这有什么关系吗?其中一种解决方案更适合于此目的吗? – nst1nctz
它取决于'rename'或'prename'命令的定义。有些版本可能每行读取一个文件名;我有的版本(最初从骆驼书第一版中选择)就是这样做的。如果使用命令行参数进行调用,则会重命名这些参数;如果在没有命令行参数的情况下调用(除了正则表达式),它会读取标准输入,在换行符上分割并将其作为文件进行处理。我的版本粗心大意地淹没整个标准输入;如果处理千兆字节的文件名,这是次优的。 –