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的默认行为是处理符号链接本身,而不是链接指向的文件).
| 归档时间: |
|
| 查看次数: |
8270 次 |
| 最近记录: |