基于含空格文件名批量移动文件至对应子目录的脚本需求
批量移动含空格文件名到对应子目录的脚本实现
没问题,我帮你写个bash脚本来搞定这个批量归类的需求——完美适配带空格的文件名,自动根据前缀创建目录并移动文件,处理几百个文件完全不在话下。
核心思路
从每个文件名中提取最后一个空格之前的内容作为目标目录名(比如foo-foo bar-bar-bar1 5644.jpg会提取出foo-foo bar-bar-bar1),然后自动创建该目录(如果不存在),最后把文件移动进去。
完整脚本
#!/bin/bash # 遍历当前目录下的所有文件(如果要指定目录,把*换成/path/to/your/files/*) for file in *; do # 只处理普通文件,跳过目录 if [ -f "$file" ]; then # 提取最后一个空格前的内容作为目录名 dir_name="${file% *}" # 创建目录(-p参数确保父目录存在,且目录已存在时不报错) mkdir -p "$dir_name" # 移动文件到目标目录,-n参数避免覆盖同名文件(可选,不需要可以去掉) mv -n "$file" "$dir_name/" fi done
脚本细节解释
"$file":必须加双引号!否则带空格的文件名会被bash拆分成多个参数,导致脚本出错。${file% *}:这是bash的参数扩展语法,作用是删除变量file中从最后一个空格开始到结尾的所有内容,正好匹配你需要的前缀提取逻辑。mkdir -p "$dir_name":-p参数非常实用,它会自动创建所有不存在的父目录,而且如果目标目录已经存在,也不会抛出错误信息,适合批量处理场景。mv -n "$file" "$dir_name/":-n参数是可选的,加上它后,如果目标目录里已经有同名文件,脚本会跳过移动,避免覆盖原有文件;如果不需要这个保护,可以直接用mv "$file" "$dir_name/"。
测试建议
在正式运行脚本前,你可以先把mv命令改成echo mv,这样脚本只会输出要执行的移动操作,不会真的移动文件,方便你验证逻辑是否正确:
echo mv -n "$file" "$dir_name/"
比如你有这些文件:
foo-foo bar-bar-bar1 5644.jpgfoo-foo bar-bar-bar1 5648.jpgfoo-foo bar-bar-bar2 123.jpg
运行脚本后,会自动创建foo-foo bar-bar-bar1和foo-foo bar-bar-bar2两个目录,对应的文件都会被移动到各自的目录里。
内容的提问来源于stack exchange,提问作者JasonB11
相关产品推荐
相关产品推荐

