2011-06-22 163 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查找。 :)