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
相关产品推荐
相关产品推荐

