想把 logs 下的 txt 全挪去备份目录,命令敲完文件却找不到了?先别慌,八成是被改名藏到了别的路径。mv 不进回收站,覆盖就是真没了,linux mv指令 用熟之前,先把防覆盖参数记牢,再谈批量操作。文件名里带空格记得用引号包住,不然 mv 会当成两个参数拆开处理。

mv 的基础写法

mv a.txt b.txt           # 重命名   mv a.txt /tmp/           # 移动到目录   mv *.log /var/log/bak/   # 批量移动   mv -t /tmp/ a.txt b.txt  # 目标写在前

-t 写法在脚本里好用,目标路径固定在前,后面接一串文件,配合 find 的输出传过来都行。同一个目录内移动等于改名,瞬间完成,跨目录才涉及数据搬迁。移动时时间戳这些属性 mv 天然保留,这点和复制再删的直觉不同。

防覆盖三件套

  • mv -i:目标已存在时先问一句,交互环境建议常开。
  • mv -n:已存在就不覆盖,安静跳过,批量任务里最省心。
  • mv -f:强制覆盖,明确知道后果再用。
  • mv -b:覆盖前给目标做个备份,后缀带波浪号,手滑还有后悔药。
  • mv -v:每动一个文件打印一行,批量任务里方便核对数量。

很多发行版把 mv 别名成了 mv -i,别被这个惯坏,换了机器或者写了脚本,行为可能就不一样。想永久去掉别名,去 shell 的配置文件里找到 alias mv 那行删掉。脚本里显式写参数,不依赖别名,跑在谁的机器上都一个结果。

两个经典的坑

一是目标目录不存在时 mv 不报错,它把源文件或整个目录改名成你写的那个路径,等于换了个名字藏起来,翻半天以为数据丢了。二是跨磁盘分区移动大目录,实际是先复制再删源文件,中途断掉会剩一半,移动前先 df 看一眼源和目标是不是同一个分区,跨分区就分批挪。脚本里移动前先 test -d 判断目录,不存在就 mkdir -p,比事后找文件靠谱。

平时手敲加 -i 养成习惯,脚本里用 -n 或 -f 写明白,拿不准就先 -n 跑一遍再用 ls 对比数量。linux mv指令 参数不多,几遍就熟,关键是覆盖策略想清楚。