使用mv命令移动指定文件失败,报错无法将目录移至自身子目录
解决mv命令报错"cannot move ... to a subdirectory of itself"的问题
问题原因
你的报错是因为当ls过滤后没有匹配到任何文件/目录时,$(ls ...)会返回空字符串,导致实际执行的命令变成:
mv /gpfs/gibbs/project/MiRNA/ /gpfs/gibbs/project/MiRNA/Results/18_31length/GmSG/
这相当于尝试把MiRNA目录移动到它自己的子目录里,系统会直接禁止这种操作。之前命令能正常运行,是因为当时目录里存在符合过滤条件的文件/目录,ls能输出具体路径。
快速排查步骤
先确认当前目录下是否还有需要移动的文件:
ls --ignore=mird2.sh --ignore=Results --ignore=slurm* --ignore=scripts --ignore=Gff_data --ignore=Gmm_65_index /gpfs/gibbs/project/MiRNA/
如果输出为空,说明确实没有符合条件的文件;如果有输出,再检查是否存在特殊字符或权限问题。
改进后的命令(避免空结果问题)
方法1:使用扩展glob匹配(推荐)
先开启bash的扩展glob功能(若未开启):
shopt -s extglob
然后执行移动命令:
mv /gpfs/gibbs/project/MiRNA/!({mird2.sh,Results,slurm*,scripts,Gff_data,Gmm_65_index}) /gpfs/gibbs/project/MiRNA/Results/18_31length/GmSG/
若担心无匹配文件时的报错,可额外开启nullglob:shopt -s nullglob,此时无匹配文件时命令会直接跳过,不会执行无效的mv操作。
方法2:用数组收集文件再判断
shopt -s nullglob # 收集所有符合条件的文件到数组 files=(/gpfs/gibbs/project/MiRNA/!({mird2.sh,Results,slurm*,scripts,Gff_data,Gmm_65_index})) # 仅当数组非空时执行移动 if [ ${#files[@]} -gt 0 ]; then mv "${files[@]}" /gpfs/gibbs/project/MiRNA/Results/18_31length/GmSG/ else echo "没有符合条件的文件需要移动" fi
方法3:使用find命令(最可靠)
find命令可精准定位文件,完全避免空结果导致的路径错误:
find /gpfs/gibbs/project/MiRNA/ -maxdepth 1 -mindepth 1 \ ! -name 'mird2.sh' \ ! -name 'Results' \ ! -name 'slurm*' \ ! -name 'scripts' \ ! -name 'Gff_data' \ ! -name 'Gmm_65_index' \ -exec mv {} /gpfs/gibbs/project/MiRNA/Results/18_31length/GmSG/ \;
-maxdepth 1确保只查找当前目录,-mindepth 1排除目录本身。
内容的提问来源于stack exchange,提问作者Otis254
相关产品推荐
相关产品推荐

