有这个特殊的要求,以下面提到的格式打印给定目录中的文件
filename1 <type of file> owner group
filename2 <type of file> owner group
$
列之间的分隔符是制表符。
我已经能够编写以下命令,但system
命令的输出引入了我希望避免的新行
find . -type f | xargs -I{} ls -let {} | awk -F" " 'BEGIN{OFS="\t" ORS=":"} {cmd=sprintf("file \"%s\"", $10);system(cmd);print $3,$4}'| tr -s ':\t ' '\t'
产生的输出如下
filename1 <type of file>
owner group filename2 <type of file>
owner group $
我知道该system
命令负责我希望避免的新行 - 我出于同样的原因使用 ORS 但没有运气。
任何帮助将非常感激。
答案1
您可以从命令中使用管道 I/O awk
(至少gawk
,我还没有在 Solaris 上测试过这一点):
find . -type f | xargs ls -l | awk 'BEGIN { OFS="\t" } { command=sprintf("file \"%s\"", $9); command | getline type; close(command); print type, $3, $4 }' | tr ":" "\t"
如果你find
支持它,你可以简化它
find . -type f -ls | awk ...
有一个方便的使用资源getline
其中涵盖了许多注意事项(包括close()
不像我最初那样使用)。