如何用简单Bash命令移动文件并修改文件扩展名?
问题与解决方案
已执行操作
1. 筛选当前目录含sqlite的文件
执行命令:
ls | grep sqlite
输出结果:
null and empty string in sqlite.txt pythoin write None into sqlite.txt
2. 将文件移动到/tmp目录
执行命令:
ls | grep sqlite | xargs -i mv {} /tmp
验证移动结果:
ls /tmp | grep sqlite
输出:
null and empty string in sqlite.txt pythoin write None into sqlite.txt
需求
想用简单的Bash命令,把这些文件移动到/tmp目录的同时,将扩展名从.txt改成.rst。期望执行类似如下命令:
ls | grep sqlite | some_simple_bash_command
执行后验证结果应得到:
ls /tmp | grep sqlite
期望输出:
null and empty string in sqlite.rst pythoin write None into sqlite.rst
额外问题
grep sqlite *命令完全无法生效,附操作截图:
解决方案
1. 移动并修改扩展名的命令
用while read循环能可靠处理带空格的文件名,直接实现需求:
ls | grep sqlite | while read file; do mv "$file" "/tmp/$(basename "$file" .txt).rst"; done
原理:
- 逐行读取筛选出的每个文件名
basename "$file" .txt会去掉原文件的.txt后缀- 拼接成
/tmp/新文件名.rst的路径,完成移动并重命名
2. grep sqlite *失效的原因及修正
你误解了这个命令的作用:grep sqlite *是在当前目录所有文件的内容里搜索包含sqlite的行,不是搜索文件名。从截图看没有输出,说明当前目录的文件内容里都没有sqlite字符串,这是正常的。
如果要找文件名含sqlite的文件,用下面的命令更合适:
# 方法1:和你之前用的一致 ls | grep sqlite # 方法2:find命令,更可靠 find . -maxdepth 1 -name "*sqlite*" -type f
内容的提问来源于stack exchange,提问作者showkey
相关产品推荐
相关产品推荐

