function copy_so_files(){ SRC_DIR="$1" LIB_DIR="$2" sos=$(find "$SRC_DIR" -name *.so) for so in $sos do # so like login/models.cpython-36m-x86_64-linux-gnu.so # dest like lib.linux-x86_64_3.6/login if [ "$so" == "${so%__init__.*}"]; then dest="$LIB_DIR/${so%/*}" # mkdir mkdir -p "$dest" # copy echo "copy $so -> $dest" cp -f "$so" "$dest" fi done }
1. **函数定义**:
function copy_so_files(){
这定义了一个名为 `copy_so_files` 的函数。 2. **参数**:
SRC_DIR="$1" LIB_DIR="$2"
该函数接受两个参数:`SRC_DIR` 和 `LIB_DIR`。`SRC_DIR` 是源目录,其中包含 `.so` 文件。`LIB_DIR` 是目标目录,其中 `.so` 文件会被复制。 3. **查找 `.so` 文件**:
sos=$(find "$SRC_DIR" -name *.so)
使用 `find` 命令在 `SRC_DIR` 中查找所有 `.so` 文件,并将结果存储在变量 `sos` 中。 4. **循环遍历 `.so` 文件**:
for so in $sos do
对于 `sos` 中的每个 `.so` 文件,执行以下操作。 5. **检查是否为非 `__init__.py` 文件**:
if [ "$so" == "${so%__init__.*}"]; then
使用 Bash 的参数扩展来检查 `.so` 文件名是否不包含 `__init__.py`。这主要是为了确保我们不会错误地复制与 Python 包结构相关的文件。 6. **计算目标目录**:
dest="$LIB_DIR/${so%/*}"
根据 `.so` 文件的路径计算其目标目录。例如,如果 `.so` 文件路径是 `/path/to/src/login/models.cpython-36m-x86_64-linux-gnu.so`,那么 `dest` 会是 `/path/to/lib/login`。 7. **创建目标目录**:
mkdir -p "$dest"
使用 `mkdir -p` 命令创建目标目录。如果目录已经存在,则不会显示错误。 8. **复制 `.so` 文件**:
echo "copy $so -> $dest" cp -f "$so" "$dest"
使用 `cp -f` 命令将 `.so` 文件复制到目标目录。`-f` 标志表示如果目标文件已经存在,则覆盖它。这行代码还会输出一条消息,告知用户正在复制哪个文件到哪个目录。 9. **结束**: 在完成所有 `.so` 文件的处理后,该函数结束。 10. **示例**: 假设你有一个名为 `copy_so_files.sh` 的脚本,并且你想从 `/path/to/src/lib/python3.6/site-packages/` 复制所有 `.so` 文件到 `/path/to/lib/python3.6/site-packages/`。你可以这样调用函数: `./copy_so_files.sh /path/to/src/lib/python3.6/site-packages /path/to/lib/python3.6/site-packages/` 这将会复制所有符合条件的 `.so` 文件到目标目录。