你可以这样做,以便bash命令只在某些条件下运行吗?

时间:2014-09-25 17:00:19

标签: bash conditional-statements alias .bash-profile

我正在尝试做这样的事情(逻辑明智),但它不起作用:

if (ls | wc -l ) >100; echo "too many files!"

else ls;

重点是将其添加到我的bashrc。

有什么想法吗?

只是编辑,因为我觉得我有点误解。我想要的是,当我输入ls(或运行修改后的ls的别名)任何地方时,只有在没有很多文件时才会列出文件(我想要添加到我的文件中。 bashrc中)。作为一个白痴,我有时会在我有成千上万个文件的目录中输入ls所以我想要一种规避它的方法。

6 个答案:

答案 0 :(得分:3)

您可以使用ls数组执行此操作,而不是解析bashnot best practice

files=(*)
if ((${#files[@]} > 100)); then echo 'Too many files!'; else ls; fi

可能在实际问题中你想要一个特定的目录,而不是CWD;在这种情况下,你可能想要这样的东西:

files=(/path/to/directory/*)
if ((${#files[@]} > 100)); then
  echo 'Too many files!'
else (
       cd /path/to/directory
       ls
     )
fi

请注意,我已将cd包装到带括号的复合命令中,这意味着cd将是本地的。这假设您实际上并不希望完整路径出现在ls的输出中。

答案 1 :(得分:2)

您可以使用find

numFiles=$(find . -maxdepth 1 ! -name . -print0 | xargs -0 -I % echo . | wc -l)
(( numFiles > 100 )) && echo "too many files!" || ls

您可以将其设为功能并将其放入.bashrc

答案 2 :(得分:1)

正如其他人所指出的,这不是计算你拥有的文件数量的准确方法。例如,它会错误计算包含换行符的文件,并且可能存在其他问题。 然而,这是一个非常好的方法来计算ls将打印的行数,如果它们太多而不显示它们,那么这可能是你想要做的。

那么,要回答你的一般问题,要使一个命令取决于另一个命令的结果,你可以使用其中一个

command1 && command2

仅当command2成功时才会运行command1。如果您希望仅在第一个结果通过某些测试时执行第二个,您可以使用:

[ command1 ] && command2

对于您的示例,那将是:

[ $(ls | wc -l) -gt 100 ] && echo too many

如果测试通过,再次执行ls,请使用

[ $(ls | wc -l) -gt 100 ] && echo too || ls

if [ $(ls | wc -l) -gt 200 ]; then echo 'too many files!'; else ls; fi

然而,所有这些都是不优雅的,因为他们需要两次运行命令。更好的方法是运行命令一次,将其输出保存到变量,然后测试变量:

x=$(ls); [ $(wc -l <<<"$x") -gt 100 ] && echo 'too many!' || printf "%s\n" "$x"

此处,ls的输出保存在变量$x中,然后该变量作为wc的输入提供,如果它有超过100行,则会打印一条消息。否则,变量是。


为了完整起见,这是另一种可以正确计算文件的安全方法:

[ $(find -maxdepth 1 | grep -cF './') -gt 100 ] && echo 'too many!' || ls

答案 3 :(得分:0)

快速单线:

test `find . -maxdepth 1 -type f|wc -l` -gt 100 && echo "Too Many Files"

答案 4 :(得分:0)

短暂的

[ $(ls | wc -l ) -gt 100 ] && echo too many

答案 5 :(得分:0)

结合上面的一些回复 - 一个简单的别名:

alias chkls='MAX=100 ; F=(*) ; if [[ ${#F[*]} -gt ${MAX} ]] ; then echo "## Folder: $(pwd) ## Too many files:  ${#F[*]} ##" ; else ls ; fi '