Bash重命名扩展递归

Pep*_*ijn 12 bash batch-rename

我知道有很多这样的事情,但要么他们不能递归地工作,要么他们是巨大的.

这就是我得到的:

find . -name "*.so" -exec mv {} `echo {} | sed s/.so/.dylib/` \;
Run Code Online (Sandbox Code Playgroud)

当我运行查找部分时,它会给我一个文件列表.当我运行sed部分时,它用.dylib替换任何.so.当我一起运行它们时它们不起作用.

我用echo替换了mv,看看发生了什么:

./AI/Interfaces/C/0.1/libAIInterface.so ./AI/Interfaces/C/0.1/libAIInterface.so
Run Code Online (Sandbox Code Playgroud)

什么都没有被取代!
怎么了?

aps*_*012 24

这将正确地完成所有事情:

find -L . -type f -name "*.so" -print0 | while IFS= read -r -d '' FNAME; do
    mv -- "$FNAME" "${FNAME%.so}.dylib"
done

通过正确,我们的意思是:

1)它将重命名文件扩展名(由于使用${FNAME%.so}.dylib).使用的所有其他解决方案${X/.so/.dylib}都是错误的,因为它们错误地重命名文件名中的第一个匹配.so(例如x.so.so,重命名为x.dylib.so,或者更糟,./libraries/libTemp.so-1.9.3/libTemp.so重命名为./libraries/libTemp.dylib-1.9.3/libTemp.so- 错误).

2)它将处理文件名中的空格和任何其他特殊字符(双引号除外).

3)它不会更改目录或其他特殊文件.

4)它将跟随符号链接到子目录和目标文件的链接并重命名目标文件,而不是链接本身(find的默认行为是处理符号链接本身,而不是链接指向的文件).