2015-02-11 86 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 
相關問題