如何在Bash中输出目录中无对应文件的ID列表?
解决方案
你可以用for循环结合文件名通配符和if条件判断来实现需求,具体脚本如下:
while IFS= read -r id; do if ! compgen -G "${id}_*.txt" > /dev/null; then echo "$id" fi done < ids.txt
脚本说明
while IFS= read -r id:逐行读取ids.txt中的ID,IFS=避免ID首尾的空格被截断,-r防止转义字符被错误解析。compgen -G "${id}_*.txt":生成所有以${id}_开头、.txt结尾的文件名列表,无匹配文件时返回非零状态码。! compgen ... > /dev/null:!对状态码取反,当没有匹配文件时执行echo "$id"输出该ID;> /dev/null用于屏蔽匹配到的文件名输出,只保留存在性判断逻辑。
如果偏好更直观的写法,也可以用ls结合重定向实现(注意:文件名含特殊字符时compgen更可靠):
while IFS= read -r id; do if ! ls "${id}_"*.txt 1> /dev/null 2>&1; then echo "$id" fi done < ids.txt
原脚本问题说明
你之前的for i in $(cat ids.txt); do grep -v $i .; done逻辑错误:grep -v $i .会递归搜索当前目录下所有文件的内容,而非检查文件名前缀,因此完全偏离了需求。
内容的提问来源于stack exchange,提问作者Katherine Chau
相关产品推荐
相关产品推荐

