2014-09-25 37 views
1

我试图做这样的事情(逻辑明智的),但它不工作:你可以这样做吗,只有在某些条件下运行bash命令?

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

else ls; 

点是加入这个对我的.bashrc。

任何想法?

只是一个编辑,因为我认为我有点被误解。我想要的是,当我键入ls(或运行修改的ls的别名)任意位置时,只有在没有很多文件时才会列出这些文件(我希望将某些内容添加到我的.bashrc中)。作为一个白痴,我有时在有数千个文件的目录中输入ls,所以我想要一种方法来规避这种情况。

回答

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 
2

了可以使用find

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

您可以将此作为函数,并把它在.bashrc

0

一个快速班轮:

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

而不是解析ls,这是not best practice,你可以用bash数组来做到这一点:

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的输出中。

0

一个短

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

结合上面的一些反应的 - 一个简单的别名:

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