2014-09-25 89 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 '