Bash
使用 find 和 sed 遞歸地重命名文件
我想遍歷一堆目錄並將所有以 _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 正則表達式重命名文件)。