2012-09-11 98 views
3

可能重複:
Checking if a directory contains files測試,如果文件存在,bash腳本

我想看看如果一個目錄是空的,所以我用[如下:

[ -f "./ini/*"] 

即使目錄不爲空,返回值也始終爲1。 任何想法有什麼不對?

+2

http://stackoverflow.com/questions/91368/checking-if-a-directory-contains-files –

+1

燦沒有用,因爲在雙引號字符串中沒有執行通配符。你在ini目錄下測試名爲'*'的文件是否存在。 – Jens

回答

4

試試這個:

$ echo "*" #With quotes 

$ echo * #No quotes 

看到區別?當你在一個字符串周圍加引號時,shell不能用glob來替換帶有匹配文件的星號。

有很多方法可以得到你想要的東西。最簡單的方法是使用ls命令,而不使用測試命令。 if語句取得您輸入的命令的輸出結果。 [...]只是test命令的別名。這兩個語句是等價的:

$ if test -f foo.txt 

$ if [ -f foo.txt ] 

基本上,所有的測試命令時是返回0如果測試結果是真或非零如果測試是假的。如果給出的命令返回0退出代碼,則所有if命令都執行if語句。我要完成這個的原因是讓我們忘記測試,並簡單地使用ls命令。

假設您有一個文件foo.txt,但沒有文件bar.txt。請嘗試以下操作:

$ ls foo.txt > /dev/null 2>&1 
$ echo $? 
0 
$ ls bar.txt > /dev/null 2>&1 
$ echo $? 
2 

> /dev/null 2>&1用於抑制所有輸出。請注意,文件存在時ls命令的退出代碼爲0,而文件不存在時ls命令的退出代碼不是0。 (在這種情況下是2)。現在,讓我們使用的是替代測試命令:

if ls ./ini/* > /dev/null 2>&1 
then 
    echo "There are files in that directory!" 
else 
    echo "There are no files in that directory" 
fi 

通知我甚至不與測試命令(可以是單詞test[..])理會。

希望這對你有意義。人們有時很難意識到在BASH shell中,if命令和[...]是兩個單獨的命令,並且所有if正在執行的命令都是運行它給出的命令,然後根據它運行的命令的退出代碼進行操作。

+1

語義迂腐,'['是一個命令,但'如果'不是。相反,'if'是shell的關鍵字。 –

-2

這對我的作品

[ "$(ls -A /path/to/directory)" ] 
你的情況

這將是

[ "$(ls -A ./ini/)" ] 

您可以使用

[ "$(ls -A /tmp)" ] && echo "Not Empty" || echo "Empty" 
+3

http://mywiki.wooledge.org/ParsingLs。朋友不要讓朋友分析'ls'的輸出。 –

2

當心文件名開頭的測試 '',正常globbing或使用ls不寒而慄)將不會檢測那些有幾種方法可以做到這一點,我可以拿出最簡單的是:

/home/user1> mkdir ini 
/home/user1> cd ini 
/home/user1/ini> touch .fred jim tom dick harry 
/home/user1/ini> cd .. 
/home/user1> declare -a names 
/home/user1> names=(./ini/* ./ini/.*) 
/home/user1> number_of_files=$((${#names[@]} -2)) 
/home/user1> echo $number_of_files 
5 

-2需要從列表中刪除...

+1

也考慮'nullglob'和'dotglob'; – c00kiemon5ter

0
if find ./ini/ -maxdepth 0 -empty | read; 
then 
echo "Not Empty" 
else 
echo "Empty" 
fi 
+0

什麼是'| |閱讀'在那裏做?這不是隱藏輸出的方法。 – c00kiemon5ter

+0

只有當讀取內容(即/ some/dir /通過查找找到空)時,read纔會丟棄輸出並使表達式計算爲true。 – aurelihein

+0

如果'find'找不到任何文件,它將返回'1'。如果要隱藏輸出,請使用'>/dev/null'作爲Bash,'1>/dev/null 2>&1'作爲sh。 – c00kiemon5ter

0

如果以下命令的輸出是0那麼目錄中沒有文件(目錄爲空),否則它有文件!

$find "/path/to/check" -type f -exec echo {} \;|wc -l 

這樣對你 -

exist=`find "./ini" -type f -exec echo {} \;|wc -l` 
if [ $exist -gt 0 ] 
then 
    echo "Directory has files" 
else 
    echo "Directory is empty" 
fi 

或者

if [ `find "./ini" -type f -exec echo {} \;|wc -l` -gt 0 ] 
then 
    echo "Directory has files" 
else 
    echo "Directory is empty" 
fi