Linux下筛选含.spring无.fastq.gz文件的目录及相关查询
解决方案
一、获取仅含.spring文件、不含.fastq.gz文件的目录下的.spring文件路径
你的原命令没有过滤掉那些本身包含.fastq.gz的目录,而是单纯排除了.fastq.gz文件,所以达不到预期效果。可以用shell循环结合条件判断实现需求:
for dir in $(find "$PWD" -name "*.spring" -printf '%h\n' | sort -u); do # 检查当前目录下是否存在.fastq.gz文件,无则输出该目录下的.spring文件 if ! ls "$dir"/*.fastq.gz 1>/dev/null 2>&1; then find "$dir" -maxdepth 1 -name "*.spring" fi done
命令说明:
find "$PWD" -name "*.spring" -printf '%h\n' | sort -u:找出所有包含.spring文件的目录,%h输出文件所在目录,sort -u去重避免重复处理同一目录! ls "$dir"/*.fastq.gz 1>/dev/null 2>&1:通过ls检查目录下是否有.fastq.gz,重定向输出和错误到/dev/null避免冗余提示,!表示如果没有找到则执行后续命令find "$dir" -maxdepth 1 -name "*.spring":只输出当前目录下的.spring文件,若需要递归查找子目录里的.spring,去掉-maxdepth 1即可
二、检查目录是否同时包含.fastq.gz和.spring文件
单个目录检查
直接用条件判断即可:
dir="/path/to/your/directory" if ls "$dir"/*.spring 1>/dev/null 2>&1 && ls "$dir"/*.fastq.gz 1>/dev/null 2>&1; then echo "目录 $dir 同时包含两种文件" else echo "目录 $dir 不同时包含两种文件" fi
批量找出所有同时包含两种文件的目录
用find的-exec参数批量处理:
find "$PWD" -type d -exec sh -c 'ls "$0"/*.spring 1>/dev/null 2>&1 && ls "$0"/*.fastq.gz 1>/dev/null 2>&1' {} \; -print
命令说明:
-type d:只查找目录-exec sh -c '...' {} \;:对每个目录执行shell命令,检查是否同时存在两种文件-print:当条件满足时,输出该目录路径
内容的提问来源于stack exchange,提问作者Adarsh
相关产品推荐
相关产品推荐

