bash - 如何使用 Bash 删除文件名中的最后一个字符?
问题描述
我.txt
在一个文件夹中有几个文件,它们的名称如下所示:
file1.txt
file2.txt
file2.txt_newfile.txt
file3.txt
file4.txt
file4.txt_newfile.txt
file5.txt_newfile.txt
...
我正在尝试_newfile.txt
从文件名中删除。如果文件存在,它应该被新文件覆盖(例如file2.txt
将被替换,但file5.txt
只是被重命名)。
预期输出:
file1.txt
file2.txt # this was file2.txt_newfile.txt
file3.txt
file4.txt # file4.txt_newfile.txt
file5.txt #file5.txt_newfile.txt
...
我尝试了以下代码:
for i in $(find . -name "*_newfile.txt" -print); do
mv -f "$file" "${file%????????????}"
done
但是,我收到以下错误:
mv: rename to : No such file or directory
我做错了什么,如何重命名这些文件?
解决方案
您正在用的输出填充变量i ,但在调用中引用了未声明的find
变量file 。mv
因此它扩展为mv -f '' ''
,这就是为什么您会收到No such file or directory错误。
你最好这样做:
find -type f -name '*_newfile.txt' -exec sh -c '
for fname; do
mv -- "$fname" "${fname%_newfile.txt}"
done' _ {} +
如果这些文件都在同一个文件夹中,你甚至不需要find
,只需要一个 for 循环就可以了:
for fname in *_newfile.txt; do
mv -- "$fname" "${fname%_newfile.txt}"
done
推荐阅读
- ice - zeroc-ice34已经编译安装,但是安装debian包时检测不到
- c# - 从另一个 ListBox 添加后未找到 ValueMember
- html - 以反应形式更改第 i 个输入字段 ondelete 按钮的布尔值
- ios - 如何使用设备支持的文件从 Xcode 10.2.1 在 iOS 13 设备中运行/安装应用程序
- javascript - Sequelize 中的关联未按预期工作
- react-native - 世博会 - 将方向锁定为横向
- html - Yelp Fusion API JSON 评论解析
- reactjs - Google-maps-react 未加载地图
- wordpress - Wordpress 如何为公众生成修订列表(帖子和页面)
- r - 如何根据多个条件连接两个数据框?