Bash:使用通配符区分文件和目录

时间:2016-09-01 03:41:41

标签: bash shell wildcard

我的工作目录中有几个文件,我想打印所有的文本文件,问题出在我的WD也是目录。这意味着,当我输入:

cat *

输出结果为:

9 Tom Grapes 28
10 Ben Lemon 21
11 Paul Lime 37

Next cool file

cat: yang: Is a directory
cat: ying: Is a directory

我想删除这些'错误消息',所以我尝试了:

cat *[!/]

但它只会返回:

cat: '*[!/]': No such file or directory

但反过来说:

cat */

仅打印:

cat: yang: Is a directory
cat: ying: Is a directory

这是否意味着所有文件都以斜杠结尾?如果是,有没有办法区分文件和目录?如果没有,为什么这张外卡不起作用?

PS:我正在使用Linux

2 个答案:

答案 0 :(得分:4)

find -maxdepth 1 -type f -exec cat {} +

修改

忽略隐藏文件

find -maxdepth 1 -type f -name '[!.]*' -exec cat {} +

参考:Exclude hidden files when searching with Unix/Linux find?

答案 1 :(得分:2)

*之类的任何表达式仅指文件名本身,而不是类型。除非您有不同的命名约定(例如,文件都有扩展名,目录永远不会这样做),否则很难根据文件和目录的名称来区分文件和目录。

尾随/不是名称的一部分。

快速而肮脏的解决方案:

cat * 2>/dev/null

此添加只是抑制所有错误消息。 (实际上,它将它们重新引导到虚空。)

如果我想做得好,这将是我的第一步。它可能不是最好的解决方案,但它遍历目录中的所有条目,检查它是否是文件,并且只检查cat个。

for f in *; do
    if [[ -f $f ]]; then
        cat $f
    fi
done

可以写成一行:

for f in *; do if [[ -f $f ]]; then cat $f; fi; done

也许这里的其他人有更好的主意。