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

关于编写Bash脚本按文件扩展名归类至对应子目录的技术求助

解决Bash脚本移动文件的目录路径错误问题

别担心,刚接触Bash脚本犯点小错太正常啦~咱们先来看看你脚本里的问题:

你写的for f in */*/*.csv是在找第三级目录下的.csv文件,但实际上你的.csv文件是在FolderA/、FolderB/这些二级目录的根目录下(比如FolderA/filexx.csv),shell找不到匹配的文件,自然就会报mv: cannot stat *.csv: No such file or directory的错误啦。

下面给你两种简单的解决方案,都是纯Bash命令实现的:

方法一:遍历父目录逐个处理(新手友好,直观易懂)

这个方法会遍历当前目录下的所有子文件夹(也就是你的FolderA、FolderB),然后在每个文件夹内完成文件移动:

# 遍历当前目录下的所有子目录(末尾的/确保只匹配文件夹)
for dir in */; do
    # 检查当前目录下是否存在.csv文件,避免无匹配时mv报错
    if compgen -G "${dir}*.csv" > /dev/null; then
        mv -v "${dir}"*.csv "${dir}"Sub1/
    fi
    # 同理处理.doc文件
    if compgen -G "${dir}*.doc" > /dev/null; then
        mv -v "${dir}"*.doc "${dir}"Sub2/
    fi
done

这里用compgen -G来检查是否有匹配的文件,比ls更可靠,不会产生多余的错误输出。

方法二:用find命令批量处理(更简洁)

如果你喜欢简洁的写法,find命令可以一次性帮你定位所有目标文件并移动:

# 查找当前目录下二级深度的.csv文件,移动到对应父目录的Sub1
find . -maxdepth 2 -type f -name "*.csv" -exec mv -v {} "{}/../Sub1/" \;
# 同理处理.doc文件
find . -maxdepth 2 -type f -name "*.doc" -exec mv -v {} "{}/../Sub2/" \;

解释一下:-maxdepth 2限制只查找当前目录(深度1)和直接子目录(深度2)的文件;{}代表找到的文件路径,{}/../Sub1/就是把文件路径回溯到父目录,再指向Sub1子文件夹。

两种方法都能帮你实现目标目录结构,放心用就好~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:57:37