Shell 在UNIX中列出1到20个带模式的文件名

Shell 在UNIX中列出1到20个带模式的文件名,shell,unix,Shell,Unix,在unixshell中,我有以下命令列出当前目录中后缀模式为1到9的文件 ls cat[1-9] 输出 cat1 cat2 cat3 cat4 cat5 cat6 cat7 cat8 cat9 但当我尝试使用下面的命令时,我得到了意想不到的结果 ls cat[1-10] 输出 cat1 相反,我应该获取cat1到cat10所有文件您可以使用列表glob: ls cat{1..9} 要排除cat7: 使用: 否则: ls cat[^7] 您可以使用列表glob: ls cat{1..9}

在unixshell中,我有以下命令列出当前目录中后缀模式为1到9的文件

ls cat[1-9]
输出 cat1 cat2 cat3 cat4 cat5 cat6 cat7 cat8 cat9

但当我尝试使用下面的命令时,我得到了意想不到的结果

ls cat[1-10]
输出 cat1


相反,我应该获取cat1到cat10所有文件

您可以使用
列表glob

ls cat{1..9}
要排除cat7:

使用:

否则:

ls cat[^7]

您可以使用
列表glob

ls cat{1..9}
要排除cat7:

使用:

否则:

ls cat[^7]

glob表达式匹配的是字符列表,而不是数字
cat[1-10]
将匹配名为“cat1”(cat1到cat1)和“cat0”的文件,仅此而已。您可以使用大括号扩展,
cat{1..10}
,但这将扩展此类文件是否实际存在,因此您可能会在以后的脚本中出现“未找到文件”错误。确保的唯一方法是直接筛选列表:

cats=()
for cat in cat[0-9]*; do
  if [[ ${cat#cat} ^= *[^0-9]* ]]; then # if the part after "cat" is numeric
    cats+=("$cat")
  fi
done

glob表达式匹配的是字符列表,而不是数字
cat[1-10]
将匹配名为“cat1”(cat1到cat1)和“cat0”的文件,仅此而已。您可以使用大括号扩展,
cat{1..10}
,但这将扩展此类文件是否实际存在,因此您可能会在以后的脚本中出现“未找到文件”错误。确保的唯一方法是直接筛选列表:

cats=()
for cat in cat[0-9]*; do
  if [[ ${cat#cat} ^= *[^0-9]* ]]; then # if the part after "cat" is numeric
    cats+=("$cat")
  fi
done

[1-9]
是一个字符范围,而不是数字。
[1-9]
是一个字符范围,而不是数字。如果我想从这个列表中排除cat7文件,该怎么办?抱歉,我不理解这个要求。
ls cat{{{1..6},{8..10}
@Graeme:非常感谢,hsaka:这是你要找的吗?是的,非常感谢,以前有人告诉我使用ls cat[1-6,8-10],但它没有给我确切的输出。谢谢@Graeme,如果我想把cat7文件从这个列表中排除怎么办对不起,我不理解这个要求。
ls cat{1..6},{8..10}
@Graeme:非常感谢,hsaka:这是你要找的吗?是的,非常感谢,以前有人告诉我使用ls cat[1-6,8-10],但它没有给我确切的输出。谢谢你@Graeme