2015-11-05 42 views
-1
#!/bin/sh 

file_list=`find . -type f` 

IFS=$(echo) #this enables for loop to break on newline 
for file_ in $file_list; do 
    file $file_ 
done 

這個shell腳本會驚人地報告(File name too long)。我想這個腳本會給file喂3次$file_list !!!爲什麼for循環中的文件命令行爲如此荒謬

但是,如果我用簡單的echo更改file命令,那麼腳本將逐行打印當前目錄中的所有文件。

+4

您正在將'IFS'設置爲空並禁用分詞。所以'file_'包含'find'的* entire *輸出。這對命令行工作來說太長了。 「echo」是「工作」的,因爲換行符通過顯示。嘗試在循環中使用'printf%s'$ file_「'或'declare -p file_',看看你得到了什麼。 –

+4

另請參閱[Bash FAQ 001](http://mywiki.wooledge.org/BashFAQ/001)瞭解如何正確讀取流中的逐行數據。並閱讀[不要閱讀行](http://mywiki.wooledge.org/DontReadLinesWithFor),看看爲什麼這是一個壞主意。 –

+2

您可能打算使用'IFS = $(echo)'(命令替換,而不是參數擴展)。但這仍然是一個糟糕的主意。 – chepner

回答

0

迭代find的結果並不是一個好主意。改爲使用exec選項:

find -type f -exec file {} \;