首页 > 解决方案 > 如何使用 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

我做错了什么,如何重命名这些文件?

标签: bashrenamefile-rename

解决方案


您正在用的输出填充变量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

推荐阅读