Bash脚本使用字符串变量作rm参数出现文件名拆分报错如何解决
Bash脚本youtube-dl下载后删除本地文件报错修复
原始代码
编写的Bash脚本实现接收URL输入后,调用youtube-dl下载对应文件,再调用gdrive将文件上传到Google Drive。
原始代码如下:
cd /root/downloaded #take input read -p 'URL:' url echo echo i will convert this file... echo #download and send output to temp txt file cd /root/ youtube-dl $url --force-ipv4 --exec echo > tempyou.txt file=$(tail -1 /root/tempyou.txt) dir=""$file"" cd /root/go/bin ./gdrive upload "/root/$dir" cd /root echo name="'$dir'" path=$(pwd ~/$name) directory="${path}/${name}" rm $directory
报错现象
下载、上传功能运行正常,执行rm删除本地文件时,文件名被空格拆分为多个片段,报错如下:
rm: cannot remove "/root/'How": No such file or directory rm: cannot remove 'It': No such file or directory rm: cannot remove 'Feels': No such file or directory rm: cannot remove 'To': No such file or directory rm: cannot remove 'Code': No such file or directory rm: cannot remove 'With': No such file or directory rm: cannot remove "'Brainfuck'-T-qx-oC_lUo.mp4'": No such file or directory
修复方案
优化脚本结构,从根源避免文件名空格分词问题,具体优化点:
- 新建专用临时目录
/root/tempyt存放下载的文件,避免和其他目录下的文件混淆 - 直接读取临时目录下最新创建的文件作为下载文件名,不再依赖临时文本文件存储youtube-dl的输出
- 调用gdrive自带的
--delete参数,上传完成后自动删除本地文件,无需手动拼接路径执行rm命令,彻底规避路径分词问题
修复后的代码如下:
#!/bin/bash -i cd /root/tempyt read -p 'URL:' url echo echo i will convert this file... echo youtube-dl $url --force-ipv4 name=$(ls -Art | tail -n 1) echo "$name" path="'$name'" cd /root/go/bin/ ./gdrive upload "/root/tempyt/$name" --delete
内容的提问来源于stack exchange,提问作者Taylor Johnson
相关产品推荐
相关产品推荐

