2016-12-10 90 views
0

我有一堆代碼,這是相對較新的即大量隱藏的錯誤,我有這樣的代碼:
if [ -d $DATA_ROOT/$name ],我已經做了研究和理解,這意味着如果目錄存在,但現在我試圖打印出存在的那些目錄來解決問題。 嘗試使用顯示目錄的存在位置

echo `First: $DATA_ROOT` 
    echo `Second: $name` 
    echo `Last: $DATA_ROOT/$name` 
    exit 1; 
沒有找到所有

得到命令,代碼是爲了解決我通過提取所有文件試圖將錯誤,但並沒有最終提取出所有的結局了數據提取下面失敗的錯誤,代碼:

num_files=`find $DATA_ROOT/$name -name '*' | wc -l` 
if [ ! $num_files -eq $extract_file ] ; then 
    echo "Data extraction failed! Extracted $num_files instead of $extract_file" 
    exit 1; 

我只想正確提取所有文件,如何做到這一點嗎?

+0

考慮通過http://shellcheck.net/運行你的代碼和固定它所問問題之前在這裏找到。 –

+0

順便說一下,'-name'*''完全沒有任何作用 - 你可以忽略它,並且具有相同的效果。 –

+0

你會推薦任何我可以用來改善的在線資源嗎? @CharlesDuffy – Olli

回答

2

您使用的手段背平「執行此爲命令」

echo `First: $DATA_ROOT` 
echo `Second: $name` 
echo `Last: $DATA_ROOT/$name` 

會嘗試執行被稱爲命令「第一:」不存在。

而是使用雙引號,因爲他們允許變量替換,這樣並不會嘗試執行它作爲一個命令

echo "First: $DATA_ROOT" 
echo "Second: $name" 
echo "Last: $DATA_ROOT/$name" 

而且

find $DATA_ROOT/$name -name '*' 

可能是你想要的不是-name '*'是默認的,所以你不需要它。正如其他人指出的那樣,find將返回所有內容,包括目錄和特殊文件(如果有這些內容的話)。 find "$DATA_ROOT/$name" -type f是你想要的,如果你只想列出文件或find "$DATA_ROOT/$name" -type d,如果你只想列出目錄。同時總是在你的"$DATA_ROOT/$name"周圍使用雙引號,因爲它允許你用空格處理文件名 - 如果你有一個包含空格的$name,你將會失敗。

0

您正在使用反引號,因此在反引號任何被當作命令來執行,結果你得到命令未發現異常。你可以使用雙引號,以避免錯誤象下面這樣:

echo "First: $DATA_ROOT" 
echo "Second: $name" 
echo "Last: $DATA_ROOT/$name" 

你可以使用find命令列出下來像所有目錄:

find $DATA_ROOT/$name -type d 

上面的命令將列出所有的目錄(與-type d選項使用-type f列出所有文件)在$DATA_ROOT/$name內,然後您可以對這些目錄執行操作。

+1

單引號不會擴大變量;它需要雙引號。而且,你的'find'命令也需要雙引號,否則如果'DATA_ROOT'或'name'中的目錄包含空格,將會出錯。考慮通過http://shellcheck.net/在您的答案中運行代碼 –

0

find報告不僅普通文件,也目錄(包括.)。

使用find "$DATA_ROOT/$name" -type f