2015-02-11 110 views
0

我想做一个单行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 

任何人都可以引导我吗?

回答

3

下面是Ed的方法的组合,但是附加了file -b的输出。这似乎为我工作:

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

%b格式是512块这是我看到我的系统上的文件运行du。你可能喜欢%k代替1024K块,或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

这可能适合你。假设和解释见下面的注释。

$ 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 

管的找到AWK,使用标签作为隔膜的结果。在这里,我假设du命令与我的环境中使用选项卡分隔文件的大小。

NF > 1 

如果有一个以上的领域,我们知道这是du输出(在这里我假设的类型,没有从file返回包含制表符)。

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

打印du输出与结肠分离器,和没有换行符。 next指示它立即跳到下一行输入(file输出)。简单地打印输入,(这是file输出),以换行到stdout

1 

惯用方式。 (1是模式,总是如此,默认操作是打印就行了。)

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 "{}")' \; 
1

你看在find手册页-printf 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 
相关问题