编写Bash脚本遍历目录并按文件名上传.py文件的问题
Bash脚本实现遍历.py文件并按无扩展名文件名上传
方法一:结合find命令与basename提取文件名
适合递归遍历目录下所有.py文件,处理逻辑清晰:
#!/bin/bash # 替换为你要遍历的目标目录 TARGET_DIR="./your_target_directory" # 递归查找所有.py文件并逐行处理 find "$TARGET_DIR" -type f -name "*.py" | while read -r py_file; do # 提取不带路径和扩展名的纯文件名 filename_no_ext=$(basename "$py_file" .py) # 替换为你的实际上传命令,示例:scp "$py_file" user@server:path/to/upload/$filename_no_ext your_upload_command "path/to/upload/$filename_no_ext" done
basename "$py_file" .py:直接去掉文件的完整路径和.py扩展名,比如从zero/ein/ein.py得到ein- 用引号包裹变量,可避免文件名含空格、特殊字符时出现解析错误
方法二:用Bash参数扩展处理(无需外部命令)
通过Bash内置的参数扩展实现文件名提取,性能更优:
#!/bin/bash # 开启递归glob匹配(**代表任意层级子目录) shopt -s globstar # 替换为你要遍历的目标目录 TARGET_DIR="./your_target_directory" # 遍历所有.py文件 for py_file in "$TARGET_DIR"/**/*.py; do # 跳过不存在的文件(防止glob无匹配时的空变量) [[ -f "$py_file" ]] || continue # 第一步:去掉完整路径,得到带扩展名的文件名 filename_with_ext="${py_file##*/}" # 第二步:去掉.py扩展名 filename_no_ext="${filename_with_ext%.py}" # 执行上传命令 your_upload_command "path/to/upload/$filename_no_ext" done
${py_file##*/}:删除变量开头最长的含/前缀,仅保留纯文件名${filename_with_ext%.py}:删除变量末尾最短的.py后缀,得到目标文件名
注意事项
- 将
your_upload_command替换为实际的上传指令(如scp、curl等) - 若无需递归遍历,可去掉
shopt -s globstar,并把**/*.py改为*.py
内容的提问来源于stack exchange,提问作者pilks7
相关产品推荐
相关产品推荐

