我有以下 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
参数-l
会ls
导致它包含大量无关信息,从而搞乱 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
指定它应该是一个目录。