多个执行命令,用于查找并在同一行中提供输出

时间:2015-02-11 00:48:16

标签: linux bash awk find

我正在尝试制作单行bash脚本来收集文件名/位置,文件大小和文件类型。我设法使用以下脚本执行相同的操作:

find . -type f -exec du {} \; -exec file -b {} \;

然而,这个输出分为两行:

0   /usr/local/lib/python2.7/lib-tk/test/test_tkinter/__init__.py
empty

我想以下列格式显示它们是单行:

0   /usr/local/lib/python2.7/lib-tk/test/test_tkinter/__init__.py
empty

size : file name : file type

任何人都可以指导我吗?

4 个答案:

答案 0 :(得分:4)

这是Ed的方法的组合,但附加了file -b的输出。它似乎对我有用:

find . -type f -printf "%b : %p : " -exec file -b {} \;

%b格式化程序在512个块中,这就是我在系统上的文件上运行du的内容。对于1024K块,您可能希望%k或者Ed显示的%s%p格式化程序输出完整的文件名。输出没有在printf格式化程序中给出回车符,然后执行exec。我无法找到提供file -b功能的格式化程序。

例如:

find . -type f -printf "%b : %p : " -exec file -b {} \;
8 : ./data : ASCII text
8 : ./awko : data
0 : ./nothing : empty
8 : ./data2 : ASCII text

这是指向我使用的find man page的链接。

答案 1 :(得分:2)

您是否查看了-printf手册页中的find arg?

$ ls -al
total 65
drwxr-xr-x+ 1 Ed None 0 Feb 10 19:38 .
drwxr-xr-x+ 1 Ed None 0 Feb  9 08:41 ..
-rw-r--r--  1 Ed None 2 Feb 10 19:40 a
-rw-r--r--  1 Ed None 0 Feb 10 19:38 b

$ find . -printf "%s : %p : %y\n"
0 : . : d
2 : ./a : f
0 : ./b : f

答案 2 :(得分:1)

这可能对你有用。请参阅下面的注释,并附有假设和解释。

$ find so -type f -exec du {} \; -exec file -b {} \; | awk -F\t 'NF > 1 { printf "%s:%s:", $1, $2 ; next }1'
8:so/a.txt:ASCII text
8:so/anotherfile.txt:ASCII text
8:so/b1.txt:ASCII text
8:so/b2.txt:ASCII text
8:so/input.txt:ASCII text
8:so/long.txt:ASCII text, with very long lines
8:so/ref.txt:ASCII text
63504:so/somezip.zip:Zip archive data, at least v1.0 to extract
8:so/this.is.a.file.txt:ASCII text
8:so/yet-still-another-file.txt:ASCII text

备注

awk -F\t

使用tab作为分隔符将find的结果传递给awk。在这里,我假设du命令使用选项卡将文件大小与文件分开。

NF > 1

如果有多个字段,我们知道它是du输出(这里我假设从file返回的类型都没有包含制表符)。

{ printf "%s:%s:", $1, $2 ; next }

使用冒号分隔符打印du输出,并使用尾随换行符。 next告诉它立即跳到下一行输入(file输出)。

1

使用换行符简单地将输入(即file输出)打印到stdout的惯用法。 (1是模式,始终为true,默认操作是打印行。)

答案 3 :(得分:0)

find  -type f -exec sh -c 'du {};echo -n size:$(du --summarize --human-readable "{}"|cut -f1)"  ";echo -n filname:$(basename "{}");echo "  "filetype:$(file -b "{}")' \;