Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:使用通配符区分文件和目录_Bash_Shell_Wildcard - Fatal编程技术网

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

Bash:使用通配符区分文件和目录,bash,shell,wildcard,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 di

我的工作目录中有几个文件,我想打印所有的文本文件,问题是我的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

任何类似
*
的表达式都只引用文件名本身,而不是类型。除非您有一个独特的命名约定(例如,所有文件都有扩展名,而目录从来没有扩展名),否则很难根据文件和目录的名称来区分它们

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

快速而肮脏的解决方案:

cat * 2>/dev/null
此添加只会抑制所有错误消息。(实际上,它会将它们重新路由到空隙。)

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

for f in *; do
    if [[ -f $f ]]; then
        cat $f
    fi
done
它可以写在一行中:

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

也许这里的其他人有更好的想法。

任何像
*
这样的表达式只指文件名本身,而不是类型。除非您有一个独特的命名约定(例如,所有文件都有扩展名,而目录从来没有扩展名),否则很难根据文件和目录的名称来区分它们

find -maxdepth 1 -type f -exec cat {} +
尾随的
/
不是名称的一部分

快速而肮脏的解决方案:

cat * 2>/dev/null
此添加只会抑制所有错误消息。(实际上,它会将它们重新路由到空隙。)

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

for f in *; do
    if [[ -f $f ]]; then
        cat $f
    fi
done
它可以写在一行中:

for f in *; do if [[ -f $f ]]; then cat $f; fi; done
也许这里的其他人有更好的主意

find -maxdepth 1 -type f -exec cat {} +
编辑:

忽略隐藏文件的步骤

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

编辑:

忽略隐藏文件的步骤

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


参考资料:

它可以工作,但我不知道为什么,无论如何,谢谢。我想我会在bash上详细说明,等我有了一些诀窍后再回答这个问题。但是你能解释一下,为什么我建议的命令不起作用吗?我已经编辑了我的答案来详细说明我的工作。我将给你一个简单的例子,我有3个文件:“file1”,“file2”,“file3”。为了得到'file3',你可以使用
cat*[3]
来得到相反的结果,你可以使用
cat*[!3]
,第一个命令是'file3',第二个命令是'file1'和'file2'。回到我的问题:
cat*/
只会返回错误,因为只引用了目录。现在反之亦然:要仅引用“非目录”(=文件),我将使用
cat*[!/]
,但奇怪的是,这不起作用。这就是我的观点,我希望现在能更好地理解。好吧,你已经发现了我的
bash
技能的优势。但是我的任何一种解决方案都应该有效,您也可以使用@sp asic的想法,即使用
find
;)好吧,这很奇怪。这个小问题意味着这样的努力。我以为几秒钟内就能搞定,但是。。是 啊谢谢你的回复!这很管用,但我不知道为什么,谢谢你。我想我会在bash上详细说明,等我有了一些诀窍后再回答这个问题。但是你能解释一下,为什么我建议的命令不起作用吗?我已经编辑了我的答案来详细说明我的工作。我将给你一个简单的例子,我有3个文件:“file1”,“file2”,“file3”。为了得到'file3',你可以使用
cat*[3]
来得到相反的结果,你可以使用
cat*[!3]
,第一个命令是'file3',第二个命令是'file1'和'file2'。回到我的问题:
cat*/
只会返回错误,因为只引用了目录。现在反之亦然:要仅引用“非目录”(=文件),我将使用
cat*[!/]
,但奇怪的是,这不起作用。这就是我的观点,我希望现在能更好地理解。好吧,你已经发现了我的
bash
技能的优势。但是我的任何一种解决方案都应该有效,您也可以使用@sp asic的想法,即使用
find
;)好吧,这很奇怪。这个小问题意味着这样的努力。我以为几秒钟内就能搞定,但是。。是 啊谢谢你的回复!当然,您可以使用
find
。但你不是在用大锤敲开一个坚果吗?还有一个注意:这会发现隐藏的文件。这可能是您想要的,也可能不是。@chw21隐藏文件的一个优点,可以通过添加“-not-path”。/.*.”来避免隐藏文件。。。在使用
find
时,它是一个用于搜索文件的命令,因此我认为在Unix工具中使用
find
不是一把大锤,而是一把瑞士军刀。当然,您可以使用
find
来实现这一点。但你不是在用大锤敲开一个坚果吗?还有一个注意:这会发现隐藏的文件。这可能是您想要的,也可能不是。@chw21隐藏文件的一个优点,可以通过添加“-not-path”。/.*.”来避免隐藏文件。。。在使用<代码>查找< /COD>这是一个用来搜索文件的命令,所以我不认为在UNIX工具中使用这个工具是错误的,<代码>查找< /C>是少了一把大锤和一把瑞士军刀。注意:你正在使用BASH,但是如果你可以自由选择shell,你可以考虑使用ZSH。在bash中很难解决的几个问题在Zsh中很容易解决(尽管有时看起来有点神秘)。在您的情况下,Zsh命令将是
cat*(^/)
。括号中的表达式表示“无目录”。与bash对应项一样,如果没有普通文件,则会出现错误。如果你想要那只猫的话,simp