我正在尝试做这样的事情(逻辑明智),但它不起作用:
if (ls | wc -l ) >100; echo "too many files!"
else ls;
重点是将其添加到我的bashrc。
有什么想法吗?
只是编辑,因为我觉得我有点误解。我想要的是,当我输入ls(或运行修改后的ls的别名)任何地方时,只有在没有很多文件时才会列出文件(我想要添加到我的文件中。 bashrc中)。作为一个白痴,我有时会在我有成千上万个文件的目录中输入ls所以我想要一种规避它的方法。
答案 0 :(得分:3)
您可以使用ls
数组执行此操作,而不是解析bash
,not 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 '