修剪文件名仅保留最后 5 个字符

Jim*_*mmy 2 bash terminal

想知道你是否可以帮忙。我有数千个这样的文件名:

\n
2016-IMG123\nIMG124\n2018-13727-IMG123\n
Run Code Online (Sandbox Code Playgroud)\n

I\xe2\x80\x99m 尝试在终端中创建一个衬垫来重命名文件夹中的所有这些文件,只保留最后 6 个字符。

\n
 for f in *; do mv "$f" "${f%?????}"; done\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的出发点,但我发现使用 for 循环有点令人困惑。大多数示例代码都讨论从前面删除 x 个字符,而不是通过从开头删除任何附加字符来仅留下 6 个字符。

\n

kva*_*our 5

因此,我们的想法是从开头删除一个字符串,您可以使用变量替换来完成此操作${var#string}。但你想定义什么是字符串,字符串是删除最后 5 个字符后string剩下的所有内容。var这是由 给出的${var%?????}。所以你可以使用${var#"${var%?????}"}. 您的代码现在将显示为:

$ for f in *; do mv -- "$f" "${f#"${f%?????}"}"; done
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的初始文件名短于 5 个字符,则此方法和许多其他方法可能会失败。您可以通过以下方式保护自己免受这种影响:

for f in *; do 
  g="${f#"${f%?????}"}"
  [ "$g" ] &&  mv -- "$f" "$g"
done
Run Code Online (Sandbox Code Playgroud)

注意:建议明确引用字符串${f%?????}。这是为了避免不必要的全局扩展。有关详细信息,请参阅此问题下方 @LeaGris 的评论。