可能重複:
Checking if a directory contains files測試,如果文件存在,bash腳本
我想看看如果一個目錄是空的,所以我用[
如下:
[ -f "./ini/*"]
即使目錄不爲空,返回值也始終爲1。 任何想法有什麼不對?
可能重複:
Checking if a directory contains files測試,如果文件存在,bash腳本
我想看看如果一個目錄是空的,所以我用[
如下:
[ -f "./ini/*"]
即使目錄不爲空,返回值也始終爲1。 任何想法有什麼不對?
試試這個:
$ 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
正在執行的命令都是運行它給出的命令,然後根據它運行的命令的退出代碼進行操作。
語義迂腐,'['是一個命令,但'如果'不是。相反,'if'是shell的關鍵字。 –
這對我的作品
[ "$(ls -A /path/to/directory)" ]
你的情況
這將是
[ "$(ls -A ./ini/)" ]
您可以使用
[ "$(ls -A /tmp)" ] && echo "Not Empty" || echo "Empty"
http://mywiki.wooledge.org/ParsingLs。朋友不要讓朋友分析'ls'的輸出。 –
當心文件名開頭的測試 '',正常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
需要從列表中刪除.
和..
。
也考慮'nullglob'和'dotglob'; – c00kiemon5ter
if find ./ini/ -maxdepth 0 -empty | read;
then
echo "Not Empty"
else
echo "Empty"
fi
什麼是'| |閱讀'在那裏做?這不是隱藏輸出的方法。 – c00kiemon5ter
只有當讀取內容(即/ some/dir /通過查找找到空)時,read纔會丟棄輸出並使表達式計算爲true。 – aurelihein
如果'find'找不到任何文件,它將返回'1'。如果要隱藏輸出,請使用'>/dev/null'作爲Bash,'1>/dev/null 2>&1'作爲sh。 – c00kiemon5ter
如果以下命令的輸出是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
http://stackoverflow.com/questions/91368/checking-if-a-directory-contains-files –
燦沒有用,因爲在雙引號字符串中沒有執行通配符。你在ini目錄下測試名爲'*'的文件是否存在。 – Jens