如何在bash中使用通配符重命名文件?

Ang*_*loC 0 bash

我试图将一些文件重命名为另一个扩展名:

# mv  *.sqlite3_done *.sqlite3
Run Code Online (Sandbox Code Playgroud)

但得到一个错误:

mv: target '*.sqlite3' is not a directory
Run Code Online (Sandbox Code Playgroud)

为什么?

Ry-*_*Ry- 6

mv只能将多个文件移动到一个目录中; 它不能将每个人移动到不同的名称.你可以循环使用bash:

for x in *.sqlite3_done; do
    mv "$x" "${x%_done}"
done
Run Code Online (Sandbox Code Playgroud)

${x%_done}_done从最后删除$x.


use*_*793 6

通配符扩展导致将多个名称传递给命令。shell 认为您正在尝试将多个文件移动到该*.sqlite3目录。

您需要使用循环:

for nam in *sqlite3_done
do
    newname=${nam%_done}
    mv $nam $newname
done
Run Code Online (Sandbox Code Playgroud)

%_done说,除去最后一次出现_done在字符串。

如果文件名中可能有空格,则需要引用文件名。


小智 5

最简单的方法是使用 find

find . -type f -name '*.sqlite3_done' -exec sh -c 'x="{}"; mv "$x" "${x%_done}"' \;
Run Code Online (Sandbox Code Playgroud)

  • Bash-easy 并不是普通的简单。 (3认同)