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

如何正确使用find ... -exec ... 移动目录中除指定项外的所有文件和目录?

移动目录内容并排除指定文件/目录的正确方法

我来帮你搞定这个问题,这里有两种靠谱的实现方式,分别适配不同的场景,我给你一步步拆解清楚:

方法一:用find + -exec(灵活适配复杂筛选)

如果需要按更复杂的规则筛选(比如按文件类型、修改时间),find配合-exec是个好选择。假设你的源目录是/my-source/,要移到/my-dest/,需要排除temp.log文件和backup/目录,正确的命令写法如下:

find /my-source/ -mindepth 1 \! -name "temp.log" \! -path "/my-source/backup/*" \! -path "/my-source/backup" -exec mv {} /my-dest/ \;

关键参数解释:

  • -mindepth 1:只处理源目录里的内容,不会把源目录本身移过去
  • \! -name "temp.log":排除名为temp.log的文件(\!是-not的替代写法,部分shell里用-not更直观,比如-not -name "temp.log")
  • \! -path "/my-source/backup/*" + \! -path "/my-source/backup":同时排除backup目录本身和它下面的所有内容,避免find进入目录处理子文件
  • -exec mv {} /my-dest/ \;:对每个找到的文件/目录执行mv命令,{}代表当前匹配到的对象,\;是-exec的结束标记(必须加)

注意事项:

如果你的shell是bash,!可能会被当作历史命令扩展符,这时候用-not代替\!更稳妥,不会出现语法错误。

方法二:用rsync(简洁直观,适合简单排除)

如果只是单纯排除几个文件或目录,rsync的语法会更简洁,还能保留文件的权限、时间戳等属性。同样以上面的场景为例,命令如下:

rsync -av --remove-source-files --exclude="temp.log" --exclude="backup/" /my-source/ /my-dest/

关键参数解释:

  • -av:a是归档模式(保留文件属性),v是显示详细同步过程,方便你确认操作
  • --remove-source-files:同步完成后删除源文件(注意:这个参数只会删除已经同步的文件,空的源目录需要手动清理,比如事后用find /my-source/ -type d -empty -delete删除空目录)
  • --exclude="xxx":指定要排除的对象,目录后面加/可以明确告诉rsync这是一个目录,避免和同名文件混淆

如果想要彻底清空源目录(除了排除的内容),可以先同步再删除源目录(谨慎操作!):

rsync -av --delete --exclude="temp.log" --exclude="backup/" /my-source/ /my-dest/ && rm -rf /my-source/

总结

  • 要是需要复杂的筛选规则(比如只移动最近7天修改的文件,同时排除特定目录),选find+-exec更灵活
  • 只是简单排除几个文件/目录,rsync的写法更省心,还能保留文件属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:45:53