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

