HOWTO · Linux

在 Linux Bash 中移动多个文件

本文介绍如何使用文件名和通配符将多个文件移动到 Linux 中的另一个目录。

本页内容

要将多个文件移入同一个 Linux 目录,请先写出源文件路径,并将目标目录放在最后。你可以逐一指定源文件,也可以让 Bash 在启动 mv 之前展开通配符模式。下面的示例使用一组小文件,方便你了解每种选择方式的效果。

准备示例文件和目标目录

这个整合示例会在 Folder1 中创建六个文件,创建 Folder2,并依次演示三种移动方式。请在 Bash 中运行;脚本退出时会删除临时工作目录。下方各节中的移动命令彼此独立,并不是要继续处理此脚本运行后剩下的文件。若要尝试其中任意一种,请开启一个新的 Bash 会话,并使用 work=$(mktemp -d); cd "$work"; mkdir Folder1; cd Folder1; touch file1.txt file1.pdf file2.txt file2.pdf file3.txt file3.pdf; mkdir Folder2 重新创建初始文件。然后只运行相应章节中的移动命令。

运行此示例时请注意,代码中的标签和输出保持英文。

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

set -eu
work=$(mktemp -d)
trap 'rm -rf "$work"' EXIT
cd "$work"
mkdir Folder1
cd Folder1
for name in file1.txt file1.pdf file2.txt file2.pdf file3.txt file3.pdf; do
  : > "$name"
done
mkdir Folder2
mv file1.txt Folder2/
mv file2.* Folder2/
mv *.pdf Folder2/
printf 'Files now in Folder2:\n'
printf '%s\n' Folder2/*
Files now in Folder2:
Folder2/file1.pdf
Folder2/file1.txt
Folder2/file2.pdf
Folder2/file2.txt
Folder2/file3.pdf

Folder2 会在移动之前创建。最终列表中有五个文件:file3.txt 留在 Folder1 中,因为三种源文件选择方式都没有匹配到它。

使用 mv 移动指定文件

如果你知道文件的确切名称,请将每个名称列在目标目录之前:mv file1.txt file2.txt file3.txt Folder2/。Bash 会将这些名称作为独立参数传递,而 mv 会把每个源文件移到最后一个参数指定的位置。目标是现有目录时,末尾的斜杠可以省略,因此写成 Folder2 也可以。

如果你只想移动经过挑选的一组文件,尤其是要让其他名称或扩展名的文件留在原处,使用明确的文件名会更合适。文件较多时,请检查拼写和大小写;Linux 路径区分大小写。如果源路径有误,mv 会报告错误,而不会移动该源文件。

使用 * 匹配相似文件名

星号可以匹配文件名中的任意字符序列。例如,mv file2.* Folder2/ 会选中以 file2. 开头、后缀任意的文件,例如 file2.txt 和 file2.pdf。当一组相关文件具有相同的基本文件名、但扩展名不同时,这种方式很有用。

Bash 会针对当前目录中的条目展开此模式。它不会搜索嵌套目录;如果某个目录名称符合模式,也可能匹配到该目录。如果当前目录中有名称相似的目录或你不打算移动的文件,请先检查匹配结果。

使用 * 匹配文件扩展名

若要按扩展名选择文件,请将扩展名放在星号之后:mv *.pdf Folder2/ 会移动当前目录中匹配的 PDF 文件。此模式会匹配基本文件名以 .pdf 结尾的文件,但不会匹配子目录中的文件或扩展名为大写 .PDF 的文件。

引号会阻止 Bash 展开通配符。因此,mv '*.pdf' Folder2/ 会将字面模式作为一个源文件名传递;如果你要移动一组文件,这通常不是想要的结果。要让 Bash 匹配文件名,请不要给模式加引号。

检查匹配结果和目标目录行为

移动一组文件之前,可以用 printf '%s\n' *.pdf 检查展开结果。该命令会逐行打印匹配到的路径,不会更改文件。在 Bash 的默认配置下,如果没有路径匹配,模式会保持为字面文本;之后运行 mv 时,它会报告找不到该源文件。nullglob 等 Shell 选项会改变这种行为,因此不要假设未匹配的模式总会消失。

当 mv 接收到多个源文件时,最后一个参数必须是现有目录。如果合适,可以先用 mkdir -p Folder2 创建该目录。如果最后指定的路径不是目录,mv 就无法将多个源文件放在那里。还要检查目标目录中已有的文件:移动文件时,同名的目标文件可能会被替换,具体取决于命令选项和系统行为。先检查匹配结果和目标目录内容,可以确认选中的源文件并避免意外。