有没有类似于zsh文件类型通配符的bash命令?

5
在zsh中,您可以使用文件类型断言来限定通配符,例如*(/)只匹配目录,*(.)只匹配普通文件。在bash中有没有一种方法可以做到这一点,而不必求助于find命令?
2个回答

3

你可以尝试

ls -ltrd */ #match directories using -d and the slash "/"

或者
echo */

或者

for dir in */
do
  ...
done

如果需要进行递归操作,且您拥有Bash 4+版本

$ shopt -s globstar
$ for dir in **/*/; do echo $dir; done

这太明显了,我感觉有点傻...除了-d以外的所有ls选项都是多余的 :) - tobyodavies
不要难过,我也有同感... 真不敢相信我竟然错过了那个! - osirisgothra

0

我认为没有直接实现这个的方法,但不要忘记你可以使用test选项-d-f来确定名称是指目录还是文件。

for a in *; do
  if [ -d "$a" ]; then
    echo Directory: $a
  elif [ -f "$a" ]; then
    echo File: $a
  fi
done

不幸的是,这比使用find更糟糕 - 我可以使用带有xargs的find获取一个命令行,以便将其传递给另一个脚本,而不是单独测试每个结果。我只是想要一种基于通配符的方法,因为您无法在bash函数中使用xargs... - tobyodavies
我很惊讶你认为调用多个新进程在某种程度上比直接方法更好。你能在问题中更详细地解释一下你想做什么吗? - Tim
为了澄清,使用ghostdog74的解决方案,我想调用一个名为fooBar */的bash函数。如果我把fooBar变成一个脚本,我可以使用find . -maxdepth 1 -type d -print0 | xargs -0 fooBar命令,这比在for循环中构建数组要容易得多。 - tobyodavies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接