You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux命令行递归移除文件名指定前缀(保留路径)

批量移除文件名中第一个“- ”前的内容

刚好之前帮朋友处理过几乎一模一样的批量重命名需求,给你整理个高效又安全的解决方案,完全适配你数千个文件的场景:

find . -type f -name "*-*" -exec bash -c '
for file do
  dir=$(dirname "$file")
  base=$(basename "$file")
  new_base=${base#*- }
  if [ "$base" != "$new_base" ]; then
    mv -v "$file" "$dir/$new_base"
  fi
done
' bash {} +

命令拆解&说明

我把每个部分的作用拆解给你,方便你理解和调整:

  • find . -type f -name "*-*":遍历当前目录(.)下所有文件,只挑文件名里带-的(过滤掉不符合你格式的文件,避免无效操作)。
  • -exec bash -c '...' bash {} +:把找到的文件批量传给bash子进程处理,{} +会一次性传递多个文件名,比逐个处理的{} \;快很多,适合大量文件的场景。
  • 循环内部的逻辑:
    • dir=$(dirname "$file"):单独提取文件的目录路径,防止误改目录名。
    • base=$(basename "$file"):提取纯文件名(不带路径部分)。
    • new_base=${base#*- }:这是bash的参数展开技巧,#表示从开头删除最短匹配的模式,这里匹配*- ,刚好删掉第一个- 及其之前的所有内容,完美契合你的需求。
    • 加个判断if [ "$base" != "$new_base" ]; then:避免对已经处理过的文件重复操作(比如不小心再次运行命令时,不会报错)。
    • mv -v "$file" "$dir/$new_base":-v会打印每一步的重命名操作,方便你核对,觉得没问题可以去掉-v提速。

必看的安全提示

  • 先测试再执行! 把mv -v改成echo mv -v,这样命令只会打印出要执行的重命名操作,不会真的修改文件,确认所有预期的文件名都能正确修改后,再去掉echo执行真实操作。
  • 这个命令能处理带空格、特殊字符的文件名,因为所有变量都用双引号包裹了,避免了空格导致的拆分问题。
  • 如果只想处理某个特定目录下的文件,把find .改成find /path/to/your/target/folder就行。

举个实际例子,你的文件:

原路径:/Folder 0001 - 0500/0001 - Portrait - House.jpg
处理后:/Folder 0001 - 0500/Portrait - House.jpg

完全符合你的要求,放心用就行~

内容的提问来源于stack exchange,提问作者qkzoo1978

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:22:36