Bash

使用 find 和 sed 遞歸地重命名文件

  • May 11, 2018

我想遍歷一堆目錄並將所有以 _test.rb 結尾的文件重命名為以 _spec.rb 結尾。這是我從來沒有完全弄清楚如何用 bash 做的事情,所以這次我想我會付出一些努力來搞定它。到目前為止,我做得很短,我最大的努力是:

find spec -name "*_test.rb" -exec echo mv {} `echo {} | sed s/test/spec/` \;

注意:在 exec 之後有一個額外的回顯,以便在我測試它時列印命令而不是執行命令。

當我執行它時,每個匹配的文件名的輸出是:

mv original original

即 sed 的替換已失去。有什麼訣竅?

如果你沒有rename(它是一個非常短的 Perl 腳本)或者你的重命名是更簡單的 util-linux 版本,或者你只是想知道如何使你的命令工作:你只需要將它發送到 shell 執行:

find spec -name "*_test.rb" -exec sh -c 'echo mv "$1" "$(echo "$1" | sed s/test.rb\$/spec.rb/)"' _ {} \;

太複雜。如果您有rename可用的命令,您可以嘗試以下操作:

find . -name "*_test.rb" -print0 | xargs -0 rename "s/_test/_spec/" 

這會找到相關文件,將它們發送到 xargs,後者又使用重命名工具(根據給定的 perl 正則表達式重命名文件)。

引用自:https://serverfault.com/questions/226627