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

bash脚本移动trr文件触发重复操作警告,添加-not -path无效求助

解决find移动trr文件时重复匹配目标目录文件的问题

原脚本

dir=$(pwd)

traj_ext='trr'

# 目标目录
all_trr=${dir}/PCA

# 重建目标目录
if [ -d "${all_trr}" ]; then
  rm -rf "${all_trr}"
  mkdir "${all_trr}"
else
  mkdir "${all_trr}"
fi

# 查找并移动trr文件
find "$dir" -maxdepth 2 -name "*.${traj_ext}" -exec mv {} "$all_trr" \; # -not -path "${all_trr}"

报错信息

mv: '/home/user/Bureau/NMR_Analyse/BAK_MDtest_ultimo/PCA/prod_MD_BAK_360deg_300K.trr' et '/home/user/Bureau/NMR_Analyse/BAK_MDtest_ultimo/PCA/prod_MD_BAK_360deg_300K.trr' identifient le même fichier

问题原因

你尝试用-not -path "${all_trr}"排除目标目录,但这个参数仅排除了PCA目录本身,不会排除目录下的文件。当find遍历到目标目录时,依然会匹配到里面的trr文件,导致mv尝试将文件移动到自身路径,触发报错。

修复方案

方案1:用-prune跳过目标目录遍历(推荐)

-prune会直接跳过指定目录的遍历,效率更高,修改后的find命令如下:

find "$dir" -maxdepth 2 -path "${all_trr}" -prune -o -name "*.${traj_ext}" -exec mv {} "$all_trr" \;

逻辑说明:

  • -path "${all_trr}" -prune:匹配到PCA目录后,跳过对该目录的遍历
  • -o:逻辑或,后续规则仅作用于未被prune的路径
  • 最终只会查找目标目录以外的trr文件并移动

方案2:精确排除目标目录下的所有文件

如果坚持使用-not -path,需要匹配目标目录下的所有内容,修改参数为:

find "$dir" -maxdepth 2 -name "*.${traj_ext}" -not -path "${all_trr}/*" -exec mv {} "$all_trr" \;

${all_trr}/*会匹配PCA目录下的所有文件和子目录,从而排除已移动的trr文件。

额外优化:简化目录重建逻辑

原脚本的if-else可以简化为一行命令,不管目录是否存在,都会先删除再创建:

rm -rf "${all_trr}" && mkdir -p "${all_trr}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:25:27