2011-06-22 165 views
0

這是我的作業練習之一。shell腳本幫助

 
Write a shell program, which will take a directory as an argument. 
The script should then print all the regular files in the directory and all 
the recursive directories, with the following information n the given order for 
each of the files 

File name (full name from the specified directory)  file size owner 

In case the directory argument is not given, the script should assume the 
directory to be the current working directory 

我對如何解決這個問題感到困惑。對於文件列表部分,我嘗試了

ls -R | awk ...
,但我無法做到這一點,因爲我無法爲awk找到合適的字段分隔符。 我知道它不公平的要求解決方案,但請你們能給我一個提示,告訴我如何解決這個問題?提前致謝。

回答

3

你真的不想爲此使用ls和awk。相反,您需要檢查文檔以查找以確定要在以下腳本中放入什麼字符串:

 
find ${1:-.} -type f -printf "format-string-to-be-determined-by-reader\n" 
+0

你的意思exec命令? – CHID

+0

沒有--exec該--printf選項查找(GNU發現4.1.20,可能還有其他人)給你你需要的一切。 –

+0

謝謝,這是有益的 – CHID

0

AWK是很好..用" +"作爲分隔符。

+0

當我給ls -R時,完整的輸出會進入頁面。當找到一個新的目錄時,就會出現一個像./blah/blah這樣的大行,並且該模式再次像ls -l那樣。如果我錯了,請糾正我。輸出沒有任何+號?如何與它分開 – CHID

+0

@CHID:FS需要一個正則表達式。 (在gawk中,-F「」會顯得特別容許做同樣的事情,不過,請參閱上面的評論,不要使用ls + awk來做這件事) –

2

的問題是,解析的ls輸出保持在最好的最壞的複雜和危險的。

什麼你會想要做的是使用find產生的文件列表和一個小的shell腳本來生成所需的輸出。雖然有很多可能的方法來做到這一點,我會用下面的一般形式

while read -r file ; do 
    # retrieve information about $file 
    # print that information on one line 
done < <(find ...) 

有了合適的find命令來選擇文件。要檢索有關這些文件的元數據,我可能會多次在循環內使用stat

我希望這是足夠的提示,但如果你想要一個完整的答案,我可以提供。

+0

謝謝@Sorpigal。我試圖同時,做之間執行你的一個非常簡單的版本,具有回聲喜。 '而讀-r文件;不要 在線路回聲「嗨」 做過<<(找到)'我收到錯誤爲「(意外」 3 – CHID

+0

空白是很重要的。'做<<(找到)'是不一樣的'做<< (找到)'。 – Sorpigal

0

Bah。使用ls或找到的挑戰在哪裏?也可以在Perl中寫一行代碼來完成所有的工作,然後從腳本中調用單行代碼。 ;)

你可以做你的遞歸目錄遍歷在外殼本身,並利用統計得到的大小和所有者。基本上,你編寫一個函數來列出目錄(對於*中的元素),並且如果[[-d $ element]]爲真,那麼函數改變到目錄並調用它自己。類似於

do_print "$elem" 
if [[ -d "$elem" ]] 
then 
    cd "$elem" 
    process_dir 
    cd .. 
fi 

或類似的東西。

呀,你就會有數不勝數的系統調用來統計,但恕我直言這可能是最好的機器,分析其輸出的目的是供人閱讀的一個程序的輸出。在這種情況下,性能不是問題,這是值得的。

獎金超開心快樂的日子,IFS的值更改爲它不會出現在一個文件名,以便外殼通配將不會通過包含在其名稱中的空白文件混淆的值。我會建議換行符或斜線。

或採取簡單的方法,只需使用printf查找。 :)