为什么以下 bash 命令不能正常工作?

为什么以下 bash 命令不能正常工作?

我有以下 bash 命令:

$(ls -l /var/ | grep www) > cat folder_exists

但它无法正常工作。我希望实现的是一个命令,检查/var/文件夹中是否有 www 文件夹,并将该特定命令的结果打印到文件中folder_exists。我也尝试多次重新输入该命令,示例如下

cat $(ls -l /var/ | grep www) > folder_exists

甚至

cat $(ls -l /var | grep www) > folder_exists

以防那一刀造成伤害,但却无济于事。

我的问题是,尽管我创建了文件folder_exists,但我无法将输出打印到其中。有人能告诉我我哪里出错了吗?

答案1

最好这样做:

if [ -d /var/www ] ; then touch folder_exists ; else touch folder_absent ; fi

该命令的第一个版本执行以下操作:$( ... )首先被 生成的任何内容替换...。由于您调用 ls -l | grep www,因此您要么得到一行包含多个单词,要么什么都没有。在第一种情况下,它试图被执行,但这没有什么意义。如果您输入

drwxr-xr-x 15 root root     4096 Aug 20 13:48 log

在命令提示符下?没有名为 的命令drwxr-xr-x。如果您使用cat $( ls -l /var | grep www)形式,则首先将$( ... )替换为 生成的内容...,然后 cat 将其解释为要 cat 的文件列表(以 开头drwxr-xr-x;很可能没有这样的文件)。

此外,如果你尝试做这样的事情:

command > cat file

会发生的情况是,它将cat被解释为一个文件名来存储 的输出command,而不是命令。要将其解释cat为命令,您需要一个管道符号,就像您在 ls | grep 中正确使用的那样:

command | cat

但是,如果您的目的是将命令的输出存储在文件中,那么只需使用

command > file

事实上,你可以这样做

ls /var | grep www > file

仅当 ls 中没有 www 文件夹时,此文件才会为空。但请注意!如果存在文件夹 /var/ewwwocks,则该文件也会包含一行。最好使用

ls /var/www > file

长话短说,使用条件构造 if ... ; then ... ; else ... ; fi

答案2

删除括号。

 ls -l /var/ | grep www > folder_exists

工作得很好。

答案3

参数-lls导致它包含大量无关信息,从而搞乱 grep。正确的命令应该是ls -a /var/ | grep www > folder_exists

答案4

我建议使用find这样的任务:

find /var -type d -name '*www*' -maxdepth 1
  • -name '*www*'匹配任何名为 的东西www-iname如果匹配不区分大小写,请使用。
  • find默认情况下是递归的,因此该maxdepth选项确保只有/var/*www*匹配。
  • -type d指定它应该是一个目录。

相关内容